最近有一些比较有价值的文章似乎没引起太多人注意,比如 Steve Huffman 分享创建 Reddit 过程中的经验这篇文章,在 Twitter 上的中文技术圈子似乎没有被提及。
作为社会化新闻站点,国内似乎关注 Reddit 的人并不多,我只知道少数 Geek 是其死忠粉丝。Reddit 在 2005 年 6 月由 Steve Huffman 与 Alexis Ohanian 创建,之后在 2007 年被 Condé Nast 收购。到现在看 Alexa 排名在 300 名之内。
根据维基百科的介绍(refer):Reddit 最早是用 Common Lisp 开发,随之用 Python 进行了重写。著名的Python 框架 Web.py 就是 Reddit 当时的员工 Aaron Swartz 开发的,现在 Reddit 的 Web 框架则使用了 Pylons 。在 2009 年 11 月,Reddit 迁移到 Amazon 的云计算平台。前端框架现在用的是 jQuery。或许你早就知道,Reddit 网站程序现在已经开源,如果你感兴趣的话,不妨下载研究。
严格来说,Steve 的这个演讲其实并没有涉及多深入的技术信息,只是这几条经验的确可以作为通用规则与大家分享。
- 宕机是家常便饭(Crash Often)
可能很多人会认为一些 Startup 的创建人都是天才,其实也未必。两个22岁的初出茅庐的大学毕业生写的程序会好到哪里?网站起步的时候,频繁的宕机让他们吃尽了苦头。其实 Twitter 以及最近热火的 FourSquare 在初期的稳定性也不怎么样,但是仍然能对用户产生足够的吸引力。这是很多创业者需要细思量之处。
- 服务分离( Separation of Services)
现在已经超过 20 台数据库,每个数据库只处理一种特定类型的数据,原因无他,更为简化。另外,Reddit 得到的一个经验是不要使用 Python 的线程,而是用多进程的方式。
- 开放 Schema(Open Schema)
个人觉得,应该叫 Key-Value 更恰当。
- 无状态处理请求(Keep it Stateless)
"无状态"意味着横向扩展更为容易。单节点服务器向多台扩展,或许这是第一个要考虑的问题。否则,背的包袱就会越来越重。
- Memcached
除了尽可能的利用 Memcached 加速用户对数据的访问速度,在 Memcached 中存储了大量预生成的页面内容,另外,也在适当的场景使用了 MemcacheDB 以满足数据持久化的需要。
- 存储冗余数据(Store Redundant Data)
让站点变得更慢的一个"好办法"就是遵循范式设计数据库。除了在 RDBMS 中存储数据外,在上一条提到的 MemcacheDB 中也存储了大量数据,和收益相比,冗余的成本并不高。前提是数据一致性要能得到有效保证。
- 脱机工作(Work Offline)
尽可能的异步处理用户操作,对计算量比较大的功能利用离线计算的模式。消息队列用用 RabbitMQ(Rabbit Technologies Ltd.已经被 SpringSource 收购) ,采用了 AMQP 协议。
或许还有意犹未尽之处,各位自己顺着文章来源分析吧。Reddit 就像一个技术标本,仔细琢磨下去还会有很多有趣的地方,相信也会对你有帮助。