2022-02-27 22:51:34
Twitter的Timeline服务通过写扩散(Fanout)机制、分层存储架构、混合拉取与推送模式,结合对读写路径的针对性优化,实现了对数亿用户的高效服务。以下是具体技术实现方案:
一、核心架构设计:写扩散(Fanout)机制Twitter采用写时扩散策略处理推文分发,核心逻辑如下:
用户发布推文后,系统首先将推文存储在Redis集群中(每条推文在3台机器上备份),确保数据高可用性。
通过查询社交关系数据库(Flock)获取该用户的粉丝列表,将推文ID、发送方ID及标志位写入所有粉丝的时间线中。例如,拥有2万粉丝的用户发布推文时,系统需执行2万次插入操作。
每个用户的主页时间线以Redis List形式存储,最多容纳800条推文。活跃用户(30天内登录过)的时间线完全驻留内存,非活跃用户的时间线在首次访问时重建。
推文内容本身存储在MySQL中,时间线仅保存ID,读操作时通过multiget命令批量获取内容,减少内存占用。
优势:读操作复杂度为O(1),仅需从Redis集群定位用户时间线即可快速返回,支撑30万QPS的读请求。代价:写操作复杂度为O(N),粉丝量大的用户(如名人)发布推文时,需执行千万级插入操作,可能导致延迟。
二、分层存储与缓存优化为平衡性能与成本,Twitter采用多级存储策略:
活跃用户的时间线完全驻留Redis内存集群,确保低延迟访问(响应时间仅几十毫秒)。
推文索引(如搜索功能)存储在内存中的EarlyBird(定制版Lucene),加速搜索响应。
非活跃用户的时间线在首次访问时重建,从MySQL中查询关注列表并合并推文,重建后的时间线写入Redis缓存。
推文内容长期存储在MySQL中,通过分库分表和读写分离应对海量数据。
Redis集群作为一级缓存,存储时间线ID列表;T-bird服务作为二级缓存,存储推文内容。
对热门推文实施预热缓存,避免冷启动延迟。
Twitter结合两种模式优化用户体验:
主页时间线:用户主动刷新时,系统从Redis集群拉取时间线ID列表,再通过multiget获取推文内容,最后过滤违规内容(如法国过滤纳粹相关内容)。
搜索功能:推文写入时由Ingester进行词法分析并索引至EarlyBird,读请求由Blender合并所有分片结果后返回,复杂度为O(N),但因索引在内存中,响应时间仍控制在几百毫秒。
针对移动端和实时性要求高的场景,Twitter运行全球最大的实时事件推送系统(速率达22MB/s)。
客户端通过Socket连接推送服务,系统在150ms内完成推文推送,支持100万个并发连接(如TwitterDeck应用)。
为解决名人推文扩散延迟问题,Twitter实施读写路径平衡策略:
通过Redis集群水平扩展支撑30万QPS的读请求,集群规模随用户增长动态调整。
对热点数据实施多副本存储,避免单点瓶颈。
对名人推文采用异步批处理,将大量插入操作拆分为多个小批次执行。
优化Flock数据库查询性能,使用缓存减少社交关系查询次数。
接受“最终一致性”模型,允许时间线在推文发布后短暂延迟显示(通常在5秒内)。
通过版本号和冲突检测机制处理并发写操作。
Twitter的Timeline服务通过写扩散降低读延迟、分层存储平衡性能与成本、混合推送提升实时性,结合对大V用户的特殊优化,成功支撑了数亿用户的高并发访问。其核心思想是以读优化为导向设计系统架构,通过空间换时间(冗余存储)和计算下推(写时预处理)实现规模化扩展。