知乎

从0到100——知乎架构变迁史

作者 臧秀涛 发布于 2014年12月31日. http://www.infoq.com/cn/news/2014/12/zhihu-architecture-evolution

事件驱动的架构

这时首先需要的是一个消息队列,它应该可以获取到各种各样的事件,而且对 一致性有很高的要求 。针对这个需求,知乎开发了一个叫Sink的小工具。它拿到消息后, 先做本地的保存、持久化 ,然后再把消息分发出去。如果那台机器挂掉了,重启时可以完整恢复,确保消息不会丢失。然后它通过Miller开发框架,把消息放到任务队列。Sink更像是串行消息订阅服务,但任务需要并行化处理, Beanstalkd就派上了用场,由其对任务进行全周期管理。架构如下图所示:

页面渲染优化

知乎在2013年时每天有上百万的PV,页面渲染其实是计算密集型的,另外因为要获取数据,所以也有IO密集型的特点。这时开发团队就对页面进行了组件化,还升级了数据获取机制。知乎按照整个页面组件树的结构,自上而下 分层地获取数据 ,当上层的数据已经获取了,下层的数据就不需要再下去了,有几层基本上就有几次数据获取。

这一段是说加了区块缓存的意思吗?

面向服务的架构(SOA)

按照调用关系,知乎的服务分成了3层:聚合层、内容层和基础层。按属性又可以分成3类:数据服务、逻辑服务和通道服务。数据服务主要是一些要做特殊数据类型的存储,比如图片服务。逻辑服务更多的是CPU密集、计算密集的操作,比如答案格式的定义、解析等。通道服务的特点是没有存储,更多是做一个转发,比如说Sink。