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
2011年,他们上线了如下架构:
Staircar 的轻量级HTTP服务器+ Redis 集群。
架构图为:
四,性能指标要求
  • 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作为高速数据查询从库的异构读写分离的方案:
赠图一枚:

转载于:https://my.oschina.net/zhengyun/blog/108423

Tumblr的消息通知系统是如何构建的相关推荐

  1. Redis消息通知系统的实现

    Redis消息通知系统的实现 Posted on 2012-02-29 by 老王 http://huoding.com/2012/02/29/146 最近忙着用Redis实现一个消息通知系统,今天大 ...

  2. 消息通知系统模型设计

    本篇主要明确消息通知系统的概念和具体实现,包括数据库设计.技术方案.逻辑关系分析等.消息通知系统是一个比较复杂的系统,这里主要分析站内消息如何设计和实现. 我们常见的消息推送渠道有以下几种: 设备推送 ...

  3. 消息通知系统模型设计 1

    本篇主要明确消息通知系统的概念和具体实现,包括数据库设计.技术方案.逻辑关系分析等.消息通知系统是一个比较复杂的系统,这里主要分析站内消息如何设计和实现. 我们常见的消息推送渠道有以下几种: 设备推送 ...

  4. JAVA社交平台项目第四天 消息通知系统

    第4章 - 消息通知系统 学习目标: 了解消息通知系统的业务场景 了解消息通知和即时通讯区别 实现消息通知微服务的基本功能 实现文章订阅和群发消息 实现文章点赞和点对点消息 了解基于数据库实现的通知系 ...

  5. 消息通知系统详解2---后端设计

    消息通知系统详解1-通讯方式 消息通知系统详解2-后端设计 消息通知系统详解3-Netty 消息通知系统详解4-整合Netty和WebSocket 目录 整体设计 上线登录后向系统索取 在线时系统向接 ...

  6. 如何实现消息通知系统

    本篇主要明确消息通知系统的概念和具体实现,包括数据库设计.技术方案.逻辑关系分析等.消息通知系统是一个比较复杂的系统,这里主要分析站内消息如何设计和实现. 我们常见的消息推送渠道有以下几种: 设备推送 ...

  7. 消息通知系统详解1---通讯方式

    消息通知系统详解1-通讯方式 消息通知系统详解2-后端设计 消息通知系统详解3-Netty 消息通知系统详解4-整合Netty和WebSocket 目录 什么是消息通知系统 系统特性 通讯方式 短连接 ...

  8. 如何设计一个公司级别的消息通知系统?

    实际场景 早上买早点,扫码下单,用户在微信中会收到下单成功的服务通知. 扫码出地铁后,手机会收到APP支付通知. 微信.支付宝.刷卡消费后,手机会收到短信通知. 在海底捞吃完火锅,扫结账小票上的开票二 ...

  9. Laravel 论坛系统之消息通知功能

    消息通知 这篇文章我们来开发消息通知功能,当话题有新回复时,我们将通知作者『你的话题有新回复,请查看』类似的信息. Laravel 的消息通知系统 Laravel 自带了一套极具扩展性的消息通知系统, ...

  10. 消息通知系统设计六要素

    无论是 B 端还是 C 端产品,消息通知系统都是一个很基础且必不可少的模块,而产品经理要设计一个完整的消息通知系统并不难,只需要遵守好消息通知系统设计的六要素即可. 消息通知六要素 通知消息围绕在我们 ...

最新文章

  1. 7_2判断两个单链表是否相交,若相交,求出第一个交点
  2. 右左法则----复杂指针解析
  3. Windows phone 8 学习笔记(4) 应用的启动
  4. 搭建hexo博客并部署到github上
  5. Java程序员应该了解的10个设计原则
  6. java单例方法_Java单例模式
  7. @SpringBootApplication揭秘
  8. Ceres Solver 非线性优化库
  9. Inside ASP.NET 2.0-即时编译系统
  10. 190614每日一句
  11. 7、重建二叉树(Python)
  12. 遗传算法matlab_三分钟学会遗传算法
  13. Android动画之仿美团加载数据等待时,小人奔跑进度动画对话框(附顺丰快递员奔跑效果)
  14. 【转载】堆排序算法(图解详细流程)
  15. Codeforces 831 A Unimodal Array
  16. 使用MATLAB任意修改图片像素大小
  17. uni-app 图片上传插件使用说明
  18. java中的消息队列
  19. 【新书速递】信息安全标委会委员推荐的金融科技安全工具书
  20. 【计组】偏移地址、段地址和寻址方式

热门文章

  1. 百度地图标注公司那家好
  2. 《变革中的思索》连载三:展望个人电脑的未来之路
  3. Java 基于JavaMail实现向QQ邮箱发送邮件
  4. 25种让你精力充沛的方法
  5. 电脑重装系统后无法上网怎么办
  6. 设置ClickHouse默认用户default的密码
  7. ZohoCRM客户管理系统应用的案例分享
  8. Requested setting DATABASES, but settings are not configured. You must either define the environment
  9. Liunx操作指令大全(基础知识到应用(易上手),全网最全)
  10. win2008R2 像CA证书服务器(Linux)申请CA证书