Twitter timeline团队负责人在QCon London上分享了一篇Timelines @ Twitter的演讲,以下是其中一些摘要。
数据
1亿活跃用户
Timeline接口2万QPS
推送平均1ms,99% 4ms以内
每天2.5亿条新Tweets,平均3千/秒,峰值1万以上。
每天260亿次分发,每秒1800万(从中看出平均关注100人)
投递100万粉丝的时间需要3.5秒,每秒可投递28万
架构
材料中以介绍推(fan-out)为主
对于followers多的用户,从fan-out上采用pipeline的方式并行投递推送,每个任务负责分发4000个粉丝
fan-out首先投递到timeline cache上(page cache?)
用户收件箱采用redis存储,Redis只包括活跃用户,冷用户随时间过期
使用Redis的list数据结构,每个item中还包括tweet ID, user ID及标志位3个字段
使用Redis RPUSHX来避免写入冷用户
对于频繁访问用户的timeline, 设置in-process cache(local cache)
fan-out及fan-in的比较如下
技术选型与演进
Redis,使用了Redis来代替之前的memcached来存储vector cache
Thrift, 内部调用已经基本使用Thrift方式服务化,参看P109
Scala,内部服务基本使用Scala实现,但搜索模块使用Java实现,视频Q&A中提到
Finagle,较多篇幅介绍,是一个Scala实现的网络库,基于Netty框架的基础上