架构图
模块职责划分
- rocketmq-common:通用的枚举、基类方法、或者数据结构,包名有admin、consumer、filter、hook、message
- rocketmq-remoting:使用netty的客户端、服务端,使用fastjson序列化,自定义二进制协议
- rocketmq-srvutil:只有一个ServerUtil类,只提供Server程序依赖,尽可能减少客户端依赖
- rocketmq-store:消息存储,索引,consumerLog,commitLog等
- rocketmq-client:消息发送和接收,包含consumer和producer
- rocketmq-filtersrv:消息过滤器
- rocketmq-broker:服务端,接受消息,存储消息,consumer拉取消息
- rocketmq-tools:命令行工具
- rocketmq-namesrv:NameServer,类似服务注册中心,broker在这里注册,consumer和producer在这里找到broker地址
运行源代码
it地址: https://github.com/apache/rocketmq.git
运行配置
启动NameServer启动配置,配置下RocketHome
环境变量:ROCKETMQ_HOME=C:\codes\rocketmq-release-4.0.0-incubating
启动Broke配置
broker的启动类为org.apache.rocketmq.broker.BrokerStartup,添加程序运行参数-n 127.0.0.1:9876 autoCreateTopicEnable=true即可运行broker服务,broker服务根据配置的9876端口会将自身信息注册到namesrv中。
RocketMq架构,特性,实例代码
https://github.com/apache/rocketmq/tree/master/docs/cn
RocketMq实现原理疑问
一个mq的重要概念一般有那些?
producer,consumer,broker,partition,register center,rpc链接,序列化,数据持久化,rebalace
nameserver的作用是啥?
记录了Broke,topic,Queue的关系。
Topic和Queue,Broke 是什么样的关系,然后消息是如何发送和消费的?
1:一般来说订阅发布机制 只需要一个Queue就可以实现了,秉承着FIFO的原则,但是假如一个只有Queue,消费端的并发量就上不去,所以设计上就需要把消息分散到多个Queue上面去,然后consumer
消费对应的Queue,这样消费并发就上去了,然后把这一组Queue 就当做一个topic.
2:Broker就是存放Queue的服务,可以是多个topic的 Queue. 它们之间的关系是 一个topic对应多个Queue,然后Queue平均散落在broke上, 一个Broke至少有一个Queue.
在producer端发送消息的时候是需要指定 Topic, 然后按照某种策略发送到Queue, 一般一个Topic有默认4个Queue,然后就散落在broke上(假如有多个broke)。
3:消费的时候,consumer直接订阅的是queue,假如有4个queue,2个consumer它们会平分。然后去Queue所在的broke去消费。
是如何做持久化的?
Commitlog
rebalace是如何实现的?
通过nameserver,尽量做到平均。