Rocketmq优势:
- rocketmq原生就支持分布式,而activemq原生存在单点性。
- rocketmq可以严格的保证消息的顺序,而activemq不能保证。
- rocketmq可以提供亿级消息的堆积能力,不过这不是重点,重点是堆积了亿级消息还能保持低延迟写入。
- 丰富的消息推拉模式(push和pull):push好理解,在消费者端设置消息listener回调;pull需要应用主动的调用拉消息的方法从broker拉取消息,这里存在一个记录消费位置的问题,如果不记录会存在重复消费的问题。
- 一般mq分布式协调使用zookeeper,rocketmq自己实现了一个nameserver,更加轻量级,性能更好。
- 消息失败重试机制、高效的订阅者水平扩展能力、强大的api、事务机制等等。
- rocketmq有group的概念,通过group机制可以实现天然的消息负载均衡。
Rocketmq部署模式:
- 单master模式:无需多言,一旦单个broker重启或宕机,一切都结束了!显然,线上不可以使用。
- 多master模式:全是master,没有slave。一个broker宕机了,应用没有影响,缺点在于宕机的master上未被消费的消息在master没有恢复之前不可以订阅。
- 多master多slave模式(异步复制):高可用,采用异步复制的方式,主备之间短暂延迟,ms级别。master宕机,消费者可以从slave上消费,但是master的宕机会导致丢失掉极少量的消息。
- 多master多slave模式(同步双写):和上面的区别在于采用的是同步方式,也就是master、slave都写成功才会向应用返回成功。可见不论是数据,还是服务都没有单点,都非常可靠!缺点在于同步的性能比异步稍低。
Rocketmq项目结构:
- acl:访问权限控制模块
- broker:消息代理模块,串联 Producer/Consumer 和 Store
- client:客户端模块,包含producer和consumer,负责消息的发送和消费
- common:公共模块,供其他模块使用
- distribution:包含一些 sh 脚本和 配置,主要供部署时使用
- example:一些rocketmq使用的示例代码
- filter:过滤器模块
- logappender:接入日志需要的appender模块
- logging:日志模块
- namesrv:rocketmq的注册中心,broker,produce,consumer以及topic信息会在namesrv中注册
- openmessaging:忽略,没了解过
- remoting:远程调用模块,基于Netty实现,produer,consumer,broker之间通过这个模块通信。
- srvutil:解析命令行的工具类ServerUtil
- store:消息存储模块
- test:测试用例模块
- tools:一些工具类,基于它们可以写一些 sh 工具来管理、查看MQ系统的一些信息
对于这些模块我们不需要都去研究源码,只需要挑几个重点去关注。这里面比较重要的是broker,client,common,namesrv,remoting,store这几个模块。
Rocketmq逻辑部署架构
这是 Rocketmq 的逻辑部署结构(参考《RocketMQ原理简介 v3.1.1》),包括 producer/broker/namesrv/consumer 四大部分。namesrv 起到注册中心的作用,部署的时候会用到 rocketmq-namesrv/rocketmq-common/rocketmq-remoting 三个模块的代码;broker 部署的时候会用到 rocketmq-broker/rocketmq-store/rocketmq-common/rocketmq-remoting 四个模块的代码;producer 和 consumer 会用到 rocketmq-client/rocketmq-common/rocketmq-remoting 三个模块的代码,这里虽然将它们分开画了,但实际上一个应用往往既是producer又是consumer。