RocketMQ笔记

1. RocketMQ介绍

1.1. RocketMq功能特性

1、支持事物型消息
2、支持延时消息
3、支持消息重发
4、支持consumer端tag过滤
5、支持消息回放

1.2. 各种MQ对比

  • 队列选型维度对比
    1、系统定位
    2、支持功能
    3、可用性
    4、可靠性
    5、运维

1、基础对比

2、可靠性、可用性对比

3、功能对比

  • 分析
    1)Kafka:系统间的数据流通道(适合做大数据量对可靠性消息要求不是很严格)
    2)RocketMq:高性能可靠消息传输
    3)RabbitMq:可靠消息传输

1.3. RocketMq架构

1、Broker主从部署,自身信息注册在NameServer中
2、Client从NameServer中获取Broker信息
3、NameServer节点相互独立,无数据交互

2. 特性分析

2.1. 可靠性分析

1)同步刷盘:性能低,可靠性高
2)异步刷盘:性能高,可靠性低

1)异步复制:多Master、多Slave模式-异步复制
2)同步双写:多Master、多Slave模式-同步双写

2.2. 高可用分析

  • 主从模式master宕机

  • 集群搭建方式

    • 单master
    • 多maser
    • 多master多slave-异步复制
    • 多master多slave-同步双写

2.3. 数据存储

1、CommitLog:存储消息主体
2、ConsumerQueue:消息消费队列
3、IndexFile:消息索引文件

  • 优化
    1)CommitLog文件切分,默认1G
    2)MMap提升文件访问性能
    3)SSD

2.4. 生产方式

1)同步(sync)
2) 异步(async)
3) 单向(oneway)

2.5. 消费消息

1)PUSH :消息队列主动地将消息推送给消费者
消息实时性高,但没有考虑客户端的消费能力
2)PULL:由消费者客户端主动向消息队列去拉消息
消息实时性低,可能造成大量无效请求
3) RocketMq采用拉去模式 【LongPoll()使用一种长轮询机制】,来平衡上面push/pull模型的各自缺点

Consumer发送拉去消息
Broker hold住请求,直到有新消息再返回
请求超时,Consumer再次发起请求
请求超时时间默认30m

  • 消费方式
    集群消费:集群内部竞争消费,但条消息只消费一次,各节点均匀消费Topic的消息
    广播消息:各集群消费全量的消息,单条消息在每个集群都会被消费一次

2.6. 负载均衡

1、Producer 端负载均衡
1)定时获取Queue信息
2)负载均衡算法:随机递增取模
3)容错机制:故障延迟

2)Consumer端负载均衡
1)客户端心跳上报数据
2)定时Rebalance20s
获取队列信息、获取消费者信息、排序平均分配

客户端负载均衡
1)获取队列信息
2)获取消费者信息
3)排序平均分配
4)与上次结果比对

2.7. 半消息

1、半消息主题
1)HALF 消息:RMQ_SYS_TRANS_HALF_TOPIC(临时存放消息信息)
a: 事务消息替换主题,保存原主题和队列信息
b:半消息对Consumer不可见,不会被投递

2)OP 消息:RMQ_SYS_TRANS_OP_HALF_TOPIC(记录二阶段操作)
a:Rollback:只做记录
b:Commit:根据备份信息重新构造消息并投递

3)回查
a:对比HALF消息和OP消息进行回查

/** * RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES FROM YOUR PLATFORM OR CMS. * LEARN WHY DEFINING THESE VARIABLES IS IMPORTANT: https://disqus.com/admin/universalcode/#configuration-variables*/ /* var disqus_config = function () { this.page.url = PAGE_URL; // Replace PAGE_URL with your page's canonical URL variable this.page.identifier = PAGE_IDENTIFIER; // Replace PAGE_IDENTIFIER with your page's unique identifier variable }; */ (function() { // DON'T EDIT BELOW THIS LINE var d = document, s = d.createElement('script'); s.src = 'https://chenzz.disqus.com/embed.js'; s.setAttribute('data-timestamp', +new Date()); (d.head || d.body).appendChild(s); })();