主要观点:作者推出名为 One Million Checkboxes(OMCB)的网站,短短时间内获得大量用户,活动远超预期,导致网站频繁崩溃。作者通过一系列技术手段如使用 nginx 反向代理、Flask 与 Redis 结合等架构来维持网站运行,在应对流量增长、带宽问题、Redis 连接问题等方面采取了多种措施,包括增加服务器、批量更新、添加连接池、硬封顶带宽等,最终将网站重写为 Go 语言版本以稳定运行并实现 sunsetting(逐渐停止服务),整个过程中作者学到了很多关于服务器和互联网的知识。
关键信息:
- 6 月 26 日推出 OMCB,30 分钟后大量用户涌入,数天后出现在华盛顿邮报和纽约时报等媒体。
- 最初架构为 nginx 反向代理到 Flask 实例,Flask 与 Redis 交互,通过 bitset 存储和更新复选框状态,使用 react-window 渲染可见复选框。
- 面临流量增长、Redis 连接耗尽、带宽超支等问题,采取了增加服务器、批量更新、添加连接池、硬封顶带宽等措施。
- 因输入验证问题导致网站出现问题,如有人误操作使复选框计数超范围等,后进行修复。
- 为解决初始页面加载慢问题,添加 Redis 副本,通过硬编码获取副本 IP 来分散连接。
- 因 Flask 进程崩溃,编写脚本监控并重启系统服务以稳定网站。
- 因更新无时间戳导致客户端状态错误,添加时间戳等措施修复。
- 重写为 Go 语言版本后,网站运行速度大幅提升,需添加更好的速率限制,且网站曾被 DDoS 攻击,通过 CloudFlare 解决。
- 最终通过在 Redis 中添加更多状态实现 sunsetting,2 周 1 天后关闭网站。
重要细节: - 作者最初以为只有几百用户,没想到短时间内有 tens of thousands of users 及 millions of boxes 被操作。
- 作者最初未保留前几小时的复选框日志,后意识到问题并改进。
- 作者在 ITP 营地展示 face-controlled Pacman 游戏并邀请朋友帮忙维护 OMCB 站点。
- 作者在处理带宽问题时,通过
tc工具限制每秒发送数据量,从最初每秒发送 1 Mbit 状态快照,到最终将更新数据压缩为更短的数组发送。 - 作者在 sunsetting 过程中,通过 Lua 脚本在 Redis 中实现原子性操作,避免 race conditions(竞争条件)。
- 作者在整个过程中不断学习和调整,如意识到在高压力环境下学习的好处,对使用的技术如 Redis 和 nginx 感到满意等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。