Rocket
概念
- Name Server:Broker 的注册中心,所有的 Broker 都要注册到 Name Server
- Broker:RocketMQ 服务,是多个,每个 Broker 可以配置主从节点
- Topic:消息主题,由多个 Queue 组成(默认4个,默认不会自动创建,可以修改配置为自动创建)
- Queue:消息队列,真正接受消息的载体,队列有三个属性要关注下
- 最大位点/代理者位点:表示累计当前队列放了多少条消息
- 消费者位点:表示当前队列累计被消费了多少条消息
- 差值:代理者位点-消费者位点,队列未被消费的条数
- 如果为0:说明队列当前没有消息
- 如果是正数:如果值比较大,说明消息堆积或阻塞,要解决,如果值比较小可能是峰值情况,消费者能力跟不上,过一段时间再看看
- 如果是负数:不合理的,有可能是重置过
- Tag:消息分类,给消息打个标签,在生产消息和消费消息时指定 tag,不违反订阅一致性的前提下让消费者更灵活
- group:分组,可以给消息生产者和消费者指定一个归属的组,不管是生产者还是消费者只能属于一个组
- producer:消息生产者,要明确 Topic,表示这个消息要发到哪个 Topic
- consumer:消息消费者,要明确 Topic(订阅关系,这个消费者就消费这个 Topic 下的消息) 和 consumerGroup
- consumerGroup:消费者组,一个组下的所有消费者订阅的 Topic 必须相同
- 比如 Topc 下有 4 个 queue,分别是 q1、q2、q3、q4
- 如果消费者数量是 2( c1、c2),可能的情况是
(q1,q2) - c1
,(q3,q4) - c2
- 如果消费者数量是 3(c1、c2、c3),可能的情况是
(q1,q2) - c1
,q3 -c2
,q4 - c3
- 如果消费者数量是 4,就每个消费者绑定一个 queue
- 如果消费者数量是 5(c1...c5),可能的情况是
q1-c1
,q2-c2
,q3-c3
,q4-c4
,c5 就空闲了
生产者发送消息方式(是否等待响应划分)
- 单向:发出去就不管了
- 同步:发出去会等待 mq 主机响应,能知道是成功还是失败
- 异步:发出去后不直接等 mq 主机响应,配置一个异步回调方法,mq 主机响应后会调用这个方法
生产者发送消息方式(从功能上划分)
-
延迟消息
- 顾名思义就是延迟发送延迟消费的意思,等一段时间才执行消费逻辑
- 不是给生产者或消费者指定延迟时间,是给消息指定时间
- 具体是一个延迟级别,每个级别代表不同延迟时间(具体级别到官网找)
-
批量消息
- 一次发送多条消息,这个本没什么好说的,主要区别是怎么放到队列上
- 比如一次发送一条,轮询放到队列
- 如果是批量,这批消息算一次发送,这批次的消息都放到一个队列上
-
顺序消息
- 消费者默认是并发模式,意思多线程,这需要等待 CPU 分配调度权限的,保证不了先后顺序
- 消费者可以开启单线程模式,但是还是保证不了顺序,因为 Topic 是多个队列,每个队列里面多个消息
- 解决方案就是把 要保证顺序的消息都放到一个队列中
消费者获取消息方式
- pull:消费者主动拉取 queue 的消息
- push:queue 主动把消息推给消费者(已废弃,底层也是封装了 pull)
消息发送流程(负载均衡场景)
- 消息发送的时候会指定Name Server、Topic 、Group(对于生产者,Group 不重要)
- 消息先给 Name Server,Name Server 决定发送到哪个 Broker
- Broker 再把消息发送到具体的 Topic
- Topic 里面有多个 queue,默认轮询方式放入具体的 queue
- 假设 Topic 有 4 个队列,第一次消息放到 q1,第二次消息就放到 q2...第五次消息放入 q1
- 如果是 批量消息,消息不会分发到队列,这批次消息都发送到一个队列上
key
给消息设置一个 key,消费的时候根据这个去重
幂等
多次操作和第一次操作,产生的影响是一致的
消费
可以设置最大重试次数,不设置如果是并发模式16次,顺序模式integer最大值次,仍旧消费失败丢到死信队列(放到一个新的 topic,名称为 %DLQ%消费者组名称)
有了死信 topic ,专门写个消费者监听这个 topic,人工处理,发邮件短信等
消费者的重试,每次一个级别,累计要48小时,时间太长了,消费的时候可以拿到重试次数,可以做达到多少次就走人工处理,就不用发到死信队列
控制面板
![](https://img2024.cnblogs.com/blog/3095527/202407/3095527-20240720212309838-561814479.png)
![](https://img2024.cnblogs.com/blog/3095527/202407/3095527-20240720212310019-1196253718.png)