主要观点:作者推出名为“One Million Checkboxes”(OMCB)的网站,最初预计只有几百用户,却在数小时内吸引数万名用户,活动量远超预期,导致网站频繁崩溃。作者分享了网站的原始架构、扩展原则以及在不同阶段应对流量增长和各种问题的措施,如增加服务器、优化更新批次、添加Redis副本、调整带宽限制等,最终将网站后端重写为Go语言,并实现了网站的平稳关停。
关键信息:
- 6 月 26 日推出 OMCB,30 分钟后网站流量大增,数天后出现在华盛顿邮报和纽约时报。
- 原始架构采用 nginx 反向代理、Flask 与 Redis 交互,通过 bitset 存储和更新复选框状态,客户端使用 react-window 渲染可见复选框。
- 扩展原则包括控制成本、拥抱短期、使用简单自托管技术、追求乐趣、保持全球访问等。
- 流量增长过程中遇到服务器负载、Redis 连接数不足、带宽超支等问题,通过增加服务器、批量更新、添加连接池、调整带宽限制等方式解决。
- 网站曾因用户误操作导致数据问题,后修复并稳定运行,最终重写为 Go 语言以提升性能并实现平稳关停。
重要细节:
- 最初仅保留每天最新的 100 万条日志,导致前几小时的复选框记录缺失。
- 为避免单个 Flask 实例广播更新给自身客户端,使用了 pubsub 消息队列。
- 作者在 Hacker News 上对速率限制的解释引起误解。
- 作者在 ITP 营地展示 face-controlled Pacman 游戏并邀请朋友帮忙管理 OMCB 站点。
- 作者因误算带宽而惊慌,后通过调整状态快照频率和更新大小来控制成本。
- 网站因未正确验证输入导致用户误操作,后修复并添加了适当的验证。
- 重写为 Go 语言后,由于服务器性能提升需要添加更好的速率限制,且网站曾遭遇 DDoS 攻击并通过 CloudFlare 解决。
- sunsetting 过程中使用 Redis 的 Lua 脚本避免了 race condition,实现了复选框的冻结和网站的平稳关停。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。