程序员博客:gamer.ru 背后发生了什么
简要历史回顾
网站 gamer.ru 已经历了第三次(甚至可能是第四次)完整的代码重写。最初该项目是在遥远的零年代使用 Ruby-on-Rails 编写的。架构是单体的,因此每个用户请求都会伴随大量额外的数据库请求和所有可能的库的加载。为了在一天内应对 10 万访客的工作,必须动用整整五台强大的服务器,使用内存缓存、Redis 和在多台服务器之间复制数据库。这使得我们勉强撑到了 2018 年,直到公司开始出现财政问题,开发团队也分散了。
大约在 2020 年,网站的 SSL 证书出现了问题。更新它变得不可能,因为旧版本的 Ruby-on-Rails 依赖于旧版本的 openssl,而新的证书要求更新的版本。没人特别担心——网站勉强继续运行。在 2015 年至 2025 年期间,网站的访问量逐渐从每天 10 万下降到 1000 人。隐藏的博客和评论里开始出现大量垃圾邮件,包括一些不太体面的内容。Yandex 完全失去了对我们的兴趣,而网页管理员那里充满了关键错误的红色画布。
我们做了些什么来修复一切
网站急需严重优化,因为旧架构已不再符合现实。数据库中积累了大约 10 万个帖子和 160 万条评论,需要小心地迁移到新的引擎上。我们决定转向微服务架构,无论是在后端还是前端,顺便利用现代技术,包括流行的 HTMLElement。
项目完全从零开始使用 NodeJS 重写,没有使用任何第三方库,这保证了我们在接下来的 10 到 20 年里可以安稳地生活。现在不用担心更新某个流行库,比如 ExpressJS 或 React 会导致整个网站瘫痪,并需要再次大规模重构。甚至连帖子可视化编辑器我们也不得不自己编写,因为没有符合我们简单需求的现成解决方案。现在引擎为旧设备和搜索引擎渲染 HTML 页面,并通过 AJAX 向用户提供内容。
截至目前,网站成功地承受着约每秒 150 个请求的平均负载,而且绝大部分流量来自搜索机器人和其他爬虫。尤其是 semrush 和 openai 这些机器人,表现得像是在一天内试图抓取整个网站。如果 Yandex 缓慢索引我们的速度为每秒 1-2 个请求,这些家伙却能提出 50 个请求。
然而,经过如此优化的引擎,轻松能够用一台每月约 500 盧布的廉价虚拟机来服务这一整个机器人军团。
当然,网站偶尔会提醒我们,其错误 502 和 504 逐渐被发现并修复。有时会发现有人忘记在数据库中添加索引,有时过于复杂的请求需要拆分成几个简单的请求,而有时则是服务器上的空间不够。但我们不放弃——工作正在进行中,过程如常言所说,“在控制中”。