文档章节

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

旁观者-郑昀
 旁观者-郑昀
发布于 2013/02/08 22:50
字数 1005
阅读 2635
收藏 100

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
 
赠图一枚:
http://ww1.sinaimg.cn/bmiddle/5411bc3bjw1e16qi8eb26j.jpg

© 著作权归作者所有

旁观者-郑昀
粉丝 100
博文 77
码字总数 162700
作品 0
朝阳
私信 提问
加载中

评论(5)

BinGo_91
BinGo_91
厉害
假装在纽约
假装在纽约

引用来自“ljz”的评论

引用来自“疯狂的流浪”的评论

最后图的意思是?

做一个项目的时候就这感觉,做到最后的时候就会有恐慌不知道怎么做下去,开始规划的很好做到最后就乱了~~ 0.0 我经常遇到这问题

特别是像我这样的菜鸟
daijie
daijie
最后一张图「死线」,想了想,应该是deadline吧…………………… 翻得太可怕了。
Jiazz
Jiazz

引用来自“疯狂的流浪”的评论

最后图的意思是?

做一个项目的时候就这感觉,做到最后的时候就会有恐慌不知道怎么做下去,开始规划的很好做到最后就乱了~~ 0.0 我经常遇到这问题
疯狂的流浪
疯狂的流浪
最后图的意思是?
Go 模板引擎驱动的 IFTTT--Beehive-go

Beehive 是由 Go 模板引擎驱动的开源 IFTTT,一个灵活的事件和代理系统。它允许你创建自己的代理,执行由事件和过滤器触发的自动化任务。 功能举例: 可在 Tumblr 博客上重新发布 tweet 将传...

匿名
2017/02/20
293
0
Tumblr 架构设计

最近的新闻中我们得知雅虎11亿美元收购了Tumblr: Yahoo bought Tumblr for $1.1 billion. 你也许会发现Instagram也被Facebook重金收购的介绍. 这是一个巧合吗?这就由你来判断吧 为什么雅虎会...

_Raymond
2013/05/21
15.7K
31
Tumblr的Redis集群控制层--Staircar

Tumblr是世界上最流行的轻博客服务,其用户量在最近的一次统计中已经达到2090万,超过了全球最大的博客服务WordPress。而我们今天要介绍的是Tumblr通知系统的架构,其通知系统由一个叫Stair...

匿名
2011/07/31
2.9K
0
转:Redis消息队列的若干实现方式

微信号:neihanrukou Redis消息队列的若干实现方式 最近忙着用Redis实现一个消息通知系统,今天大概总结了一下技术细节,其中演示代码如果没有特殊说明,使用的都是PhpRedis扩展来实现的。 内...

fzxu_05
2013/03/04
6.3K
0
Tumblr推AI鉴黄计划,超30万人请愿撤回禁令

各位“老司机”们请注意,今后又少了一个“开车”的地方了! 昨天,美国著名博客网站Tumblr突然出台了新的政策决定——Tumblr将全面禁止出现任何成人内容,包括X级/裸露/黄暴的图片,GIF,视...

比特网
2018/12/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

python学习10.04:Python list列表使用技巧及注意事项

前面章节介绍了很多关于 list 列表的操作函数,细心的读者可能会发现,有很多操作函数的功能非常相似。例如,增加元素功能的函数有 append() 和 extend(),删除元素功能的有 clear()、 remo...

太空堡垒185
30分钟前
4
0
新手插画学习的方法?教你如何自学?

插画学习的方法?教你如何自学? 从小喜欢画一些漫画头像随笔画,但是其实没有基础。个人偏好小清新手绘风的插画(如下图),每每看到都希望自己能画出这样的作品。 我其实很想说画这种美术功...

huihuajiaocheng
36分钟前
5
0
面试题

1、实现clone(); 涉及知识点: 1)、typeof 判断类型 2)、精确的判断类型:因为type null是object,type []是object,无法通过typeof来达到精确的判断 obj.toString()的结果和Object.prototyp...

gtandsn
47分钟前
5
0
CentOS 7 部署 tesseract-ocr

官方地址 github yum-config-manager --add-repo https://download.opensuse.org/repositories/home:/Alexander_Pozdnyakov/CentOS_7/ 若提示 yum-config-manager: command not found 执行以......

阿白
47分钟前
3
0
JAVA比较器中comparator的使用

一个专用的比较器Comparator Comparator是一个专用的比较器,当一个不支持自比较或者自比较函数不能满足要求时,可写一个比较器来完成两个对象之间大小的比较。Comparator体现了一种策略模式...

daxiongdi
48分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部