adc2013 淘宝消息中间件技术演变

9527

2019/08/17 发布于 技术 分类

2013 年的阿里技术嘉年华 来源:https://github.com/alswl/adc2013

文字内容
1. 淘宝消息中间件技术演变 张乐伟(韩彰) 2013-7-14
2. 消息中间件技术演变 消息系统应用场景及现状 消息系统问题分析 Metaq1.0的提出及存在的问题 Metaq2.0的产生及相关功能介绍 Metaq3.0 功能特点
3. 消息系统应用场景 • • • • • • • • • 异步解耦 排队模型 流计算 流控型 重复消费 事务消息 顺序消息 定时投递 广播消息
4. 消息系统应用场景 浏览器 http请求 消息 业务层 消息 服务层 消息 DB层
5. 现状 • • • • • • • 接入系统500多个 每天消息量:30多亿接收,100多亿投递 12年双11 ,消息量5倍 13年双11 ? 堆积常发生 性能需要提升 接收投递比很多(1:15)
6. 消息系统概述 • 基于pub-sub模型消息系统 路由模块 订阅关系 管理模块 producer 通 信 层 1 消息接 收模块 内部消息 队列 2 subscriber 4 消息投 5 递模块 3 6 7 db存储 Recover 模块 通 信 层 subscriber
7. 存在的问题 • 堆积 • 堆积的产生:发送方(上游)与接收方(下游)能力 不匹配,或者接收方(下游)异常 • 堆积对自身的影响:堆积将导致存储数据积压,整个 集群性能严重下降。 • 堆积对业务方的影响:由于某个或者某几个接收方堆 积,将影响其他接收方消息的实时性。 • 性能
8. 堆积对业务方影响 • 本质 • 基于topic的模型,非queue模型,即整个系统共享一 个queue • 基于queue模型消息系统 2 sender 通 信 层 1 订阅关系 管理模块 内部消息 queue2 消息接 收模块 3 内部消息 queue1 4 6 db存储 消息投 递模块 Recover 模块 subscriber 5 通 信 层 subscriber
9. 性能 • 消息系统特点 • 存储+推送(拉取) • 消息存储时间短 • 存储 • Insert • Delete • Update • Select • 大部分情况下只是使用了数据库机器的内存 • Mysql是否适合做消息系统的存储?
10. Innodb特点 • 存储模型:B+树 • 随机写(分裂,合并) • 随机读 • 适合于读多,写少 • 特别适合于范围查找 • 存储类型 • Undolog • Data • 数据 • 索引 • Redolog • Insert,delete等 • Binlog(可以关闭)
11. 消息系统存储 • 顺序写 ? • 顺序读 ? consumer producer Server文 件存储 记录每个 consumer消 息到的位置 • 问题: • 多个topic,consumer group如何处理 • 一对多消息如何处理
12. metaq1.0存储模型 Topic1 分区1 producer System A consumer1 Topic1 分区2 System A consumer2 Topic1 分区3 Topic2 分区1 System B consumer1 Topic2 分区2
13. metaq1.0整体结构 • 基于queue模型消息系统 zk 3 5 Topic1 分区1 1 producer 通 信 层 4 consumer1 2 消息接 收模块 Topic1 分区2 Topic2分区1 Topic2 分区2 通 信 层 consumer2
14. 推拉模型区别 • 推模型优势 • Consumer扩容方便,不受分区数限制 • 支持复杂的过滤(因为订阅关系在server端) • 一个分区可以为多个consumer服务,分区数不会是瓶颈 • 拉模型优势 • Consumer端控制方便,便于业务方根据自己需要去获 取消息 • 顺序消息支持方便 • 允许长时间消费一条消息
15. Metaq 1.0特点 • 解决问题 • • • • • 性能 顺序消息 不同consumer group互相影响问题 堆积能力 内存瓶颈:sendfile
16. zero-copy 技术 • Read, write User buffer 用户空间 Kernel buffer 内核空间 DMA copy CPU copy CPU copy Socket buffer 网卡引擎 硬盘驱动 • Sendfile 用户空间 内核空间 DMA copy Kernel buffer Socket buffer DMA copy Append dscr 硬盘驱动 网卡引擎 DMA copy
17. zero-copy 技术 • Mmap, write 用户空间 内核空间 DMA copy shared Kernel buffer 硬盘驱动 User buffer CPU copy Socket buffer DMA copy 网卡引擎 • 消息系统中使用优势 • 减少上下文切换 • 减少jvm内存使用(再也不怕投递比了) • 缺点 • 需要指定待传输消息在文件中的位置及长度等(即无法将消息反 序列化到jvm中进行查找过滤)
18. metaq1.0存在的问题 • 分区瓶颈 • 分区数即可支持消费方集群的规模,与consumer机器数对应 • 不同topic需要不同分区 • 性能 • 分区数增加(文件数):顺序写,顺序读----随机写,随机读 • 分区数超过30,性能直线下降 • Client复杂 • 依赖zk,争抢分区,复杂,经常出各种问题,大量消费者场景无 法支持,如forest,6000个消费者。 • 过滤 • 针对某个topic下的消息过滤比较困难,因为利用了sendfile,无 法反序列化到JVM中过滤
19. metaq1.0存在的问题 • 内存 • 内存无法完全利用 • 无法获取落后(等待)的消息数 • 由于消息大小不确定,无法获取落后消息数(某些场景下需要)
20. Metaq 2.0 • 存储模型 System A Consumer1 producer Commitlog,存 储物理消息, 所有topic共 享 index文件,存 储消息在 commitlog中的 位置,消息长 度,及过滤信 息的hashcode System A Consumer2
21. Metaq2.0 目录结构 Topic A Index file1 分区 Commitlog Index file2 分区 Topic B Index file1 分区 Index file2 分区 • 文件目录 • Commitlog,所有topic一个commitlog文件,一个文件1G分割文件 • Index文件,一个topic一个或多个index文件(分区数),不同 topic不同index文件,且index文件数(分区数)大于等于 consumer机器数
22. metaq2.0 • 刷盘模式 • Commitlog同步刷盘,groupcommit方式顺序刷盘 • Index file 异步循环刷盘 • 内存模型 • 利用mmap,映射到pagecache,充分利用内存 • 消息读取 • 从index file中获取消息的位置,长度信息,然后从commitlog中读 取,不需要再到JVM中 • 分区数 • 单机可以支持上万分区数 • 消息过滤 • 在index file中对过滤的消息比较hashcode,存在误差 • 获取落后(等待)的消息数 • 由于index file每条消息定长,所以能计算消息数,及落后消息数 • 可以支持消息回溯,用于消费已经消费过的消息
23. Metaq 2.0 数据流动 • 消息如何在JVM堆,内存,磁盘上流动 producer Consumer1 Consumer2 拉取消息落后, 消息已经不在 内存中 1 JVM 堆 6 4 2 内存 page cache 虚拟内存 3 5 硬盘
24. metaq 2.0 整体结构 nameserver master 分发 模块 producer 通 信 层 slave 接收 模块 存储模块 物理 分区 存储 模块 模块 主备 同步 模块 存储模块 物理 分区 存储 模块 模块 接收 模块 分发 模块 通 信 层 consumer
25. metaq2.0功能特点 • • • • 高性能 支持大量分区 支持消息过滤 支持消息堆积 • 消息堆积下会有性能下降 • 天然具有限流功能 • 顺序消息支持 • Client简化 • 分区根据一定的算法分配,同时考虑机房优先,不再依赖于zk的争抢
26. metaq2.0性能数据 以下表格场景基于这个前提: 1、CPU 16Core Intel(R) Xeon(R) CPU L5630 @ 2.13GHz 2、Memory 24G 3、Disk RAID SAS 15000 1.4T 4、Linux 2.6.32 ext4 磁盘类型 刷盘策略 分区数 消息大小 发送耗时 发送消息TPS 订阅消息TPS LOAD IOWAIT NETIN NETOUT RAID SAS 15000 RAID SAS 15000 RAID SAS 15000 RAID SAS 15000 RAID SAS 15000 RAID SAS 15000 RAID SAS 15000 RAID SAS 15000 RAID SAS 15000 RAID SAS 15000 RAID SAS 15000 RAID SAS 15000 异步 异步 异步 异步 异步 同步 同步 同步 同步 同步 同步 同步 RAID SAS 15000 同步 • 1024 1024 1024 1024 10240 1024 1024 1024 1024 1024 1024 10240 128 256 2k 4k 512 128 256 2k 2k 4k 4k 512 4.1 5 3.66 5 5.3 2.9 3 4.31 4.31 7.5 7.5 7 5.3万 4.6万 3.3万 2.9万 3.6万 3.9万 3.8万 2.7万 2.7万 2.2万 2.2万 2.8万 5.3万 4.6万 3.3万 2.9万 3.6万 3.9万 3.8万 2.7万 5.8万 2.2万 3.2万 2.8万 2.7 3 3.4 4 3.3 2.9 3 3 3 3 3 3.8 0.83 1.23 1.54 2.39 1.14 1 1 1.5 1.5 1.87 1.87 3.4 14M 19M 69M 117M 18M 11M 16M 58M 58M 91M 91M 16M 27M 28M 75M 122M 18M 11M 16M 58M 122M 94M 125M 16M 1024 4k 65 0.1万 0.15万 7.7 57.4 5M 7M 堆积压测 • 先堆积500G数据,确保1024个分区全部有consumer拉取,consumer起 1024个线程拉取,且全部拉到磁盘上
27. linux IO调度 • CFQ,noop,deadline,anticipatory • CFQ queue1 queue1 Cfq insert request queue2 . . . R R Cfq dispatch request queue1 queueN Red black tree(sorted by sector) Read FIFO list(sorted by time) Write FIFO list(sorted by time) queue1
28. linux IO调度 • deadline Read RB tree(sorted by sector) Read FIFO list(sorted by time) deadline insert request deadline dispatch request write RB tree (sorted by sector) write FIFO list(sorted by time) • deadline RAID SAS 15000 同步 1024 4k 5.3 0.8万 1万 10 4 25M 45M
29. metaq3.0功能特点 • 支持事务 • 最终一致,client需要check接口 • 消息实时性 • 推拉结合 • 主备同步双写 • 主备同时写,写完返回,主写存储,备写失败,用户自 己选择。 • 主备自动切换 • 主不可用,自动切换到备 • 定时延迟消息 • 单队列并行消费 • 消费失败延时重试
30. 淘宝中间件期待各路英雄加盟! hanzhang@taobao.com 微博:@淘宝韩彰