来源:谢晞鸣 , fdx321.github.io/2017/08/16/【RocketMQ源码学习】1-总体架构/
1.为什么是RocketMQ
为什么是 RocketMQ,而不是 ActiveMQ/RabbitMQ/Kafka 呢?这不是技术选型,我只是想找一个业界比较好的、开源的 MQ 系统,学习一下 MQ 的工作原理。所以首选 Java 的(虽然语言对我来说不是问题,然还是有点学习成本的),这就只剩下 RocketMQ 和 ActiveMQ 了,这两个那就肯定 选RocketMQ 了,毕竟人家是这么吹牛逼的: “万亿级数据洪峰下的分布式消息引擎”。
2.项目结构
3.我的重点关注
这么多模块,我并不是每一个都一行行代码的去读,像 distribution、test、tools 这些我就大概扫了一眼。那么哪些是我重点关注的呢?主要是 broker、client、common、namesrv、store、remoting,这几个是核心模块,值得认真研读,其它模块不要它们也能跑起来。
4.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。
Consumer 和 Broker 之间其实还可以加一个 filtersrv,用来做消费端的消息过滤。
这里面还有几个概念:
Producer Group、Consumer Group 和 Topic 之间并没有强制的某种关系,一个 Producer Group 可以发多个 Topic 的消息,一个 Consumer Group 也可以消费多个 Topic 的消息。一个Consumer Group 可以消费来自多个 Producer Group的消息,一个 Producer Group 的消息也可以被多个 Consumer Group 消费。
Reference