class="topic_img" alt=""/>
英文原文:7 Lessons Learned While Building Reddit To 270 Million Page Views A Month
这篇文章有点老,是 2010 年的。
Reddit 在美国年轻人中很受欢迎,感觉黃易山做 CEO 后更蒸蒸日上了。
相信这 4 年间,他们面临的 scalability 的问题更严峻,一些架构可能都推倒重来了。但文中提到的 7 条经验,还是很实用的。
- Crash Often:web server 的进程常常会莫名其妙地挂掉(可能有哪个 exception 没被 catch 到,或者用太多内存被操作系统的 OOM killer 给干掉之类的)。 Reddit 用 supervise 来启动并监控进程,如果进程挂了,自动重启。现在是 2014 年了,感觉 supervisord 用得比较多点。
- Separation of Services:也就是 service oriented architecture。有几个显而易见的好处(临时头脑风暴的,不全面):1)同一个 service 访问数据库的 access pattern 比较 predictable,方便 cache; 2)哪个 service 比较吃力了,只给那个 service 加机器就行;3)fault isolation;4)不同的 service 可以在不同时间部署新代码。
- Open Schema:他们用 postgres 做数据库服务器,但只有一个表,叫 Thing。什么东西都是一个 thing,包括 user, link, comment 等。靠 python 代码来保证数据的完整性一致性。 这是很宝贵的经验。现在的趋势是,很多公司都用 mysql 或 postgres,但都把他们当做 key/value store 来用。
- Keep it Stateless:每台 app/web server 都不存状态,而是把状态保存到 memcache 中。这样的话,某台 app server 挂了就挂了,再起一台新的就是了。
- Memcached:他们把 memcached 用到了极致 - 缓存数据库中来的数据、session data、rendered page、还有一堆 precomputed data。
- Store Redundant Data:他们 precompute 了各种东西,空间换时间。各种排好序的 list 都缓存(按时间排序、按 upvote 的数量排序、按评论数排序等)。
- Work Offline:异步处理一些没必要在线处理的东西,比如生成缩略图、发邮件之类的。
Reddit 网站代码竟然是开源的,有兴趣可以读一下。