文字内容
1. MetaQ 消息中间件 誓嘉 shijia.wxr@taobao.com
2. 主要内容 1. Metaq 是什么 2. Metaq3.0 新特性 3. Metaq 常见问题 4. Q&A
3. Metaq 是什么 METAQ 是一款完全的队列模型消息中间件。单台服务器支持 5 万以上个持久消息队列,通过扩容服务器,队列数几乎可任意横 向扩展。
4. Metaq 中的队列是什么形式 ① 一个队列由多个文件组成 ② 每个文件定长,例如 1G ③ 文件名是文件起始 Offset ,用 Java long 类型表示,可认 为范围无限
5. 发送消息负载均衡
6. 订阅消息负载均衡( Rebalance ) Rebalance 算法 同一个订阅组内, Consumer 平均分配队列, 例如 5 个队列, 2 个 Consumer ,那么第一个 Consumer 消费前 2 个队列,另外一个 Consumer 消费剩下 3 个队列 如果 Consumer 数 > 队列数,则多余出的 Consumer 不消费任何队列
7. Metaq 顺序消息 public MessageQueue select(List mqs, // Message msg, Object arg) { Integer orderid = (Integer) arg; int index = orderid % mqs.size(); return mqs.get(index); }
8. Metaq 3.0 主要特性 1. 去除 ZooKeeper 、 Diamond 依赖, 3.0 独立运行,不依 赖外部系统 2. 消息查询,支持根据消息 Key 查询消息 3. 分布式事务 4. HA 增强,支持同步双写(主备都写成功,才向 Producer 返 回) 5. 长轮询方式拉消息,消息实时性同 Push 方式一致(几毫秒延 迟) 6. 定时消息,支持用户指定时间,延时投递 7. 服务端消息重试( Consumer 可为失败消息指定下次重试时 间) 8. 死信队列
9. Metaq 3.0 部署
10. Metaq 3.0 存储方案
11. Metaq 消费队列存储方案(单机 5 万个队 列)
12. Metaq 消费队列存储格式
13. Metaq 消息查询索引方案
14. Metaq 3.0 主备同步双写 1. 2. 3. 4. 向 Master 物理队列 PAGECACHE 写入消息 等待后台线程将数据同步到 Slave 向 Slave 同步成功后,向客户端返回成功 向 Slave 同步失败后,也向客户端返回成功(注:此时需要报警出 来,人工查找错误原因) 上述方式需要解决的难点 1. Metaq 存储是通过 Offset 来访问数据 ( 有别于 KV 方式 ) ,所以 主备之间数据的顺序要完全一致 ① 使用单线程同步,同步状态维护在 Slave 端。 2. 如何避免双写带来的巨大性能损耗? ① 传统 RPC (请求应答)方式无法高性能,使用专用通信协 议,避免请求发出去,等待应带的过程 ② 数据批量向 Slave 同步
15. Metaq 数据如何流动
16. Metaq 常见问题 1. Consumer Rebalance 失败怎么办 2. Consumer 消费失败,消息如何重试 3. 顺序消息消费失败,消息如何重试 4. 发送消息失败该怎么办 5. 发现消费消息慢,可能什么原因
17. Metaq 开源  Gitlab 上开源 http://gitlab.alibaba-inc.com/shijia.wxr/rocketmq  Github 上开源 https://github.com/alibaba/RocketMQ