Tumblr的消息通知系统是如何构建的

标签: tumblr 消息 系统 | 发表时间:2013-02-08 16:48 | 作者:旁观者
出处:http://www.cnblogs.com/zhengyun_ustc/

2012·2汇总

Tumblr是世界上最流行的轻博客服务之一,2007年成立。
 
一,MySQL+Memcached
初期,其通知系统是由 MySQL+Memcached 的传统架构组成。
缺点:
MySQL负担重,表象就是 MySQL 并发事务数常常达到 InnoDB global transaction 最大值,即只能有1023个并发事务(注:特指  mysql5.0/5.1存在的问题,5.5.4以上版本修复)。
 
二,Tumblr 消息系统应用特性
  • 按时间排序(Ordered by time)
  • 唯一性,每一条消息都是唯一的(Unique (no duplicate notifications))
  • 读写比大概是 60%/30%(Medium read/write ratio (60%/30%), mostly thanks to heavy caching)
  • 每个用户的消息条数一定(Fixed number of notifications per user)
  • 数据按用户划分,每个用户只能读自己的消息(Keyed by user, and read only by him/her)
 
三,修改后的架构:Staircar+Redis
Staircar 的轻量级HTTP服务器+ Redis 集群。
 
架构图为:
http://media.tumblr.com/tumblr_lollyoX2RT1qz6daf.png
 
四,性能指标要求
  • notification request volume (over 7,500/s)
  • data set size (23MM blogs, 100 notifications per blog, 160bytes per message),
  • response times (<5ms)
Staircar 实际达到的指标:
在最高峰时的响应时间也在5ms以下,其性能测试结果是能处理每秒30,000次左右的请求。
 
五,引入 redis 的 presharding 思路
关键词: presharding
缺点是,引入了运维复杂度,导致运维管理成本增加;要用好 Presharing 方案,必须有相应的自动化运维手段相配套,比如:Redis实例的启停脚本、能检查Redis状态的运维监控手段。
优点是,更好的性能,更简单的容错,更能适应业务增长。
Presharding 思路大致的描述为:
假设有N台主机,每台主机上部署M个实例,整个系统有T = N × M个实例;

由于一个Redis实例的资源消耗非常小,所以一开始就可以部署比较多的 Redis 实例,比如128个实例;
在前期业务量比较低的时候,N可以比较少,M比较多,而且主机的配置(CPU+内存)可以较低;
在后期业务量较大的时候,N可以较多,M变小。

总之,通过这种方法,在容量增长过程可以始终保持Redis实例数(T)不变,所以避免了重新 Sharding 的问题。

拆分过程如下:

  1. 在新机器上启动好对应端口的 Redis 实例。
  2. 配置新端口为待迁移端口的从库。
  3. 待复制完成,与主库完成同步后,切换所有客户端配置到新的从库的端口。
  4. 配置从库为新的主库。
  5. 移除老的端口实例。
  6. 重复上述过程迁移好所有的端口到指定服务器上。

以上拆分流程是 Redis 作者提出的一个平滑迁移的过程,不过该拆分方法还是很依赖 Redis 本身的复制功能的,如果主库快照数据文件过大,这个复制的过程也会很久,同时会给主库带来压力。所以做这个拆分的过程最好选择为业务访问低峰时段进行。

 

六,一些细节
来自于 Tumblr 开发者的一些信息:
  • Machine failures:每一个 Redis 实例都有自己的 slave,这样确保可以做 failover。
  • Performance:Staircar 没有 redis 快。但它最主要的目的是,让 redis 基础设施对任何客户端都是透明的。
  • Early Optimization:在一个庞大的基础架构中,你会面对很多局部性细节,很慢的客户端,机器宕机,其他运维问题等。我们感兴趣的是在 redis 实例池之上,构建一个高性能代理。
 
参考资源:
1)2011,tumblr官方博客, Staircar: Redis-powered notifications
2)上文的 中文译稿
3)2011,antirez, Redis Presharding 
4)2011,InfoQ, Redis复制与可扩展集群搭建,谈及一种基于MySQL作为主库,Redis作为高速数据查询从库的异构读写分离的方案:
http://www.infoq.com/resource/articles/tq-redis-copy-build-scalable-cluster/zh/resources/image3.jpg
 

赠图一枚:

本文链接

相关 [tumblr 消息 系统] 推荐:

Tumblr的消息通知系统是如何构建的

- - 博客园_旁观者-郑昀
Tumblr是世界上最流行的轻博客服务之一,2007年成立. 一,MySQL+Memcached. 初期,其通知系统是由 MySQL+Memcached 的传统架构组成. MySQL负担重,表象就是 MySQL 并发事务数常常达到 InnoDB global transaction 最大值,即只能有1023个并发事务(注:特指  mysql5.0/5.1存在的问题,5.5.4以上版本修复).

妄谈tumblr

- Version - 忘·记·时间
好吧这篇分析是4月底写的,现在的tumblr和点点都大变样啦~甚至性浪也来搅局(去屎吧),不过即使tumblr在首页强化了回复、点点引入了editor制度,这篇分析的观点我觉得还是没问题的. tumblr是microblog一种. 如果说iPad是介于传统电脑和手机之间的产品,那么tumblr则是介于blog和twitter之间的服务.

tumblr最近的数据

- Charles - 所有文章 - UCD大社区
关于tumblr最近的几个数据:. 日均PV超过2.6亿,UV超过1000万. 超过1800万个blogs搭建在tumblr的平台上,搭建在wordpress的blogs为2000万,但同期tumblr的增长速度是wordpress的两倍. 根据google analysis的数据,用户平均在tumblr上的停留时间是14分钟.

Tumblr博客数超WordPress.com

- jason - 36氪
著名的轻博客Tumblr成立只有四年时间,今天该网站托管的博客数超过了已有八年历史的WordPress.com. 一月份时Tumblr上有700万个独立博客,到目前为止,该网站上的博客计数器显示已有20873182个博客,比WordPress.com上的博客数「20820425」大约多出了8.5万个.

Tumblr 的真正起源

- - 爱范儿 · Beats of Bits
最近,轻博客 Tumblr 被 Yahoo 高价收购. 毫无疑问,Tumblr 能够获得成功,创始人 David Karp 的努力不可或缺. 正如参与创办 Tumblr 的 Marco Arment 所说,Karp 的远见和对产品的专注,造就了硅谷的一个传奇故事. 不过,历史经常告诉我们,最终成功的常常不是原创者,而是能够将产品推向大众的人.

解析社交网络Tumblr

- - Solidot
网络科学家都在分析Twitter和Facebook的数据,而遗忘了另一个社交网站:雅虎的轻博客Tumblr. 雅虎实验室的Yi Chang和同事弥补上这一空缺. Tumblr有1.6亿用户,发表了700亿帖子,它的帖子没有字符限制,支持图片、视频和音频. Chang和同事分析了去年8到9月之间发表的6亿帖子(预印本),发现90%以上的帖子由图像或文字构成.

常见开源消息系统

- - Web 开发 : 从后端到前端
消息系统的作用:异步处理、削减峰值、减少组件之间的耦合. 选择消息系统根据业务需要需要考虑以下几个方面:. 其他,如消息丢失和重复的处理. 类似 MEMCACHE 的协议. 1、2 是不错的可选开源组件:. Kafka/MetaQ: 广泛用于 Linkedin 内部 (类似有 Java 版本的国产 MetaQ).

分布式消息系统:Kafka

- - 标点符
Kafka是分布式发布-订阅消息系统. 它最初由LinkedIn公司开发,之后成为Apache项目的一部分. Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务. 在大数据系统中,常常会碰到一个问题,整个大数据是由各个子系统组成,数据需要在各个子系统中高性能,低延迟的不停流转. 传统的企业消息系统并不是非常适合大规模的数据处理.