之前在网上看到关于Twitter、Sina以及腾讯微薄的一些实现技术,这个简单做个摘要。
1、读扩散还是写扩散?
inbox: 收件箱,你收到的消息,即你所关注的人发布的消息。
outbox: 发件箱,你发布的消息。
写扩散(Push)
该方式为每个用户维护一个订阅列表,记录该用户订阅的消息索引(一般为消息ID、类型、发表时间等一些元数据)。每当用户发布消息时,都会去更新其follower的订阅列表。
优点:读很轻。初始化时仅需要读取自己的inbox即可。
缺点:写很重。每发布一个消息,会导致大量的写操作。
注:一般来说,用户发布消息,并不会更新所有followers的订阅列表,仅更新在线followers即可。
读扩散(Pull)
该方式为每个用户维护一个发送列表,记录该用户所有发表过的消息索引。
优点:写很轻,节省空间。用户每发布一条消息,仅需更新自己的outbox。
缺点:读操作很重,计算量大。假设你收听了1k用户,则初始化时,需要从1k个用户的outbox拉取消息,然后计算获得最新的n条消息。
混合模式(Push+Pull)
该方式既为读写扩散的结合,根据用户followers的数量来决定是读扩散还是写扩散。例如followers大于1k的,则使用读扩散,否则使用写扩散。
从目前现在网上的一些资料来看,Twitter是写扩散,腾讯微薄是读扩散,新浪微薄则是二者结合。
2、关于Cache
对于一个千万级甚至亿级用户的大型网站来说,合理使用Cache至关重要。
一个用户的核心数据由如下几个部分组成:inbox,outbox,关系链,消息内容。
- inbox:主要缓存消息索引,仅为在线用户缓存,从Timyang的PPT来看,新浪微薄估计是使用redis的list或set实现。
- outbox:缓存一定数量(例如200)条最近发表的消息。
- 关系链:following相对于followers来说,缓存容易些,follower加载开销比较大,例如刘翔在腾讯微薄的听众超过1600万。
- 消息内容:按内容年龄缓存;一般需要多份支持容灾;需要缓存xml,json,rss,atom等多种格式的缓存以供API使用。
以Twitter为例,其将Cache分为四类:Vector Cache,Row Cache,Page Cache,Fragment Cache,均使用memcached实现。其中:
- Vector Cache主要缓存用户的inbox以及outbox索引,其命中率高达99%;
- Row Cache主要缓存用户关系链数据,以及Tweets内容,命中率为95%;
- Fragment Cache缓存Tweet的xml,json,rss,atom四种格式数据,以供API使用,命中率为95%;
- Page Cache主要原来缓存那些高人气用户的个人主页,命中率仅为40%。
下图为TwitterCache架构图:
Twitter为啥要为API通道设置Fragment Cache和Page Cahce呢?其原因是Twitter的80%流量来自API。
下面以新浪微薄介绍一下Cache流程:
消息发布流程:
- 更新自己的outbox
- 加载followers列表
- 更新followers inbox
获取首页流程:
- 检查inbox cache是否可用
- 获取关注列表
- 聚合内容,获得消息索引
- 根据索引,返回最终聚合的消息内容
3、关于存储
目前Twitter和新浪的落地存储,都是使用MySQL。而腾讯微薄则使用采用SSD+大文件存储(每次写操作都是append操作,写操作可以先用内存缓存,达到适当大小合并,尽量减少随机写)。其他细节因不清楚或不方便透露,不做细述。
4、关于洪峰处理。
一般用异步队列处理方式。消息队列产品有:Kestrel(twitter使用Scala实现),RabbitMQ(使用Erlang实现),MemcacheQ。
Twitter 09年时,用户的平均followers数量为126个。按照每秒400消息发布数算,那每秒就需要推送126*400=50400条消息出去。为了削 峰,Twitter自己用Scala实现了一个分布式消息队列Kestrel,其代码仅为1200行,运行在3台机器上,其使用memcached协议, 其Server之间无共享状态,且全内存。新浪使用的是MemcacheQ。
参考文献:
- 构建可扩展的微薄架构,by TimYang
- Twitter, An Evolving Architecture,by Abel Avrami
- 微薄Cache设计谈,by Timyang
- Improve Running Components at Twitter (PDF slide), by Evan Weaver
- 解剖Twitter系列,by 邓侃
- 大小: 28.6 KB
分享到:
相关推荐
而且因为微博的产品特性,节假日、热门事件等可能带来突发数倍甚至十几倍的访问峰值,这些都对于支撑微博的底层基础架构提出了比较严苛的要求,需要满足:1.每秒数十万的用户请求2.数据更新的实时性3.服务请求的低...
微服务架构浅析V436页.ppt
通过微博力量浅析网络舆情.doc
Oracle体系架构浅析 数据库调优培训
计算机硬件体系架构浅析 CPU 内存 HDD/SSD 网卡 RAID卡 虚拟化
### XML架构浅析 #### 一、XML架构概述 XML(Extensible Markup Language)是一种标记语言,用于描述数据。XML架构定义语言(XML Schema Definition,简称XSD)为XML文档提供了一种类型系统,用于定义XML文档中的...
X86、ARM、MIPS微处理器架构浅析.pdf
网络安全态势感知系统架构浅析.pdf
云计算的六种架构浅析pdf,云计算的一个重要应用在于由第三方机构提供云计算数据中心,并为大量的中小企业提供远程共享式的云计算应用服务。使得这些企业不需要建设自己的数据中心就可以使用所需的计算资源,实现成本...
工业互联网安全监测省级平台技术架构浅析.docx
Hadoop HDFS和MapReduce架构浅析.pdf 更多资源请点击:https://blog.csdn.net/weixin_44155966
"ARM Cortex-A55和Cortex-A75架构浅析" ARM 处理器家族中有很多不同的架构,每种架构都有其特点和应用场景。本文将对 ARM Cortex-A55 和 Cortex-A75 架构进行浅析,帮助读者更好地理解这两种架构的特点和差异。 ...
GPU并行计算的CUDA架构浅析 CUDA架构是英伟达公司2006年推出的通用并行计算架构,提供直接的硬件访问接口,使得程序开发人员不必再依赖应用程序编程接口(Application Programming Interface,API)来实现GPU的...
CPU架构浅析,documented by alibaba engineer and dba!
未来可期 中科院计算所“香山”高性能处理器架构浅析.pdf
框架采用微内核全方位扩展架构,全方位是指其扩展方式在空间上的表现形式。整个空间架构由Handler、Interceptor、Controller、Render、Plugin五大部分组成。每个部分都是基于接口实现的,支持完整的自定义,使用灵活...
基于云计算技术的城市轨道交通信息系统统一开发测试平台应用架构浅析.pdf
**MVP架构浅析** MVP(Model-View-Presenter)架构是一种软件设计模式,尤其在Android应用开发中被广泛采用。它旨在提高代码的可测试性和可维护性,通过分离用户界面(View)、业务逻辑(Presenter)和数据模型...
JFinal 是基于Java 语言的极速 web 开发框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python等动态语言的开发效率。