记录学习rocketMq的笔记
1 rocketMQ核心概念
1.1 mqClient
无论是producer还是consumer,他们都使用一个实例那进行生产和消费,
这个实例是mqClient,这个实例包括了很多核心的实现,
我阅读到的包括:
- 定时从nameserver获取topic的路由信息,主要是更新当前client生产使用的topic或者
消费订阅的topic的路由信息,路由信息包括什么?
public class TopicRouteData extends RemotingSerializable {
private String orderTopicConf;
private List<QueueData> queueDatas; // topic持有的队列信息
private List<BrokerData> brokerDatas; // topic持有的broker信息
private HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;
}
一个topic下有多个队列,同时这些队列可以放到不同的broker中
- 定时清除掉线的broker
- 定时发送心跳到broker
- 定时更新consumer的offset
consumer有2种方式,push,pull,push是broker主动推送到client,而pull是client
自己去拉,前者实时性更高,pull需要自己写代码拉取消息
1.2 send
消息发送的步骤
- 获取topic持有的queue列表
- 根据负载均衡算法选择一个queue,是的,负载均衡是在client侧实现的
- 发送,失败则重试,每次重试都执行一次负载均衡,所以如果一个broker挂掉,那么重试会切换到
其他broker尝试发送
上面只是很简化的发送步骤,实际更复杂,比如:
参数检查,是否需要压缩,封装成request,
发送方式:
(1)异步,不阻塞
(2)同步,必须等待发送结果
(3)oneWay,不返回任何结果,不保证消息发送成功
执行hook函数,发送前执行方法,发送后执行方法(应该是用户提供hook函数)
1.3 message
消息可以分为几个部分构成:
topic:所属的topic
tags:加上一个tag,可用于业务,比如消费时可以过滤tag来选择性消费,tag的过滤甚至可以使用
sql语法
msgKey:业务上针对消息的key,会rocketMq用于建立索引,根据key查询消息时更快,建议
key保持唯一,比如orderid,这里提到rocketMq可能出现消息重复问题,但是即使相同的消息
每个消息都有唯一的id,所以用messageID来区分消息是否重复不靠谱,官方建议业务层自己实现
比如把msgKey存入数据库区分是否已经被消费过
body:消息的内容,字节数组类型,所以理论上你可以传递任何数据,图片,字符串等等。rocketMq对于大于4mb的消息
会进行压缩
property:可以放入用户一些自定义的key-value
1.4 consume
1.4.1 messageModel
messageModel就是同属一个组下面的消费者如何消费消息
广播(broadcast):这种模式一个消息会被组下面的所有消费者消费
集群(cluster):这种模式下消息被均分到每个消费者下消费
1.4.2 concurrent&orderly
顺序消费(orderly):保证消息的消费是按照FIFO方式,吞吐量会降低,需要注意这里顺序还区分局部和全局的
局部(普通顺序):一个topic有多个queue,分散到不同的broker,可以保证 一个queue的消费是顺序的
全局(严格顺序):即针对单个topic,即使分散到不同的queue上,也严格保证消费的顺序是FIFO
并行消费(concurrently):消息的消费没有顺序
消费步骤
- 订阅的topic,和tag过滤sql表达式,及其他设置
- push方式注册listener,实际就是实现拿到消息后的业务逻辑
- pull方式,自己写代码拉消息
2 rocketMq架构

nameserver:主要是保存topic路由信息以及broker信息,几乎无状态,nameserver之间不通信
broker:消息的存储,查询,投递,是mq的核心
broker的几种部署模式:
- 单个master,不可靠,宕机后服务不能使用
- 多个master,无slave,单个master宕机,上面存储的消息不可用
- 多master带有slave,主从数据同步刷新,可靠性高,但是相比异步性能降低
- 多master带有slave,主从数据异步刷新,master
3 建议
总结的知识不完全,强烈建议阅读源码种的docs,里面有各种细节,
包括架构,部署,设计,核心的存储设计,特性及概念解释等等