1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

增加了关于消息类型的介绍

This commit is contained in:
lv jiang er hao 2023-08-16 10:38:00 +08:00
parent 07c6e875da
commit 0d71c19214

View File

@ -272,6 +272,56 @@ tag:
第四、消费者通过 `NameServer` 获取所有 `Broker` 的路由信息后,向 `Broker` 发送 `Pull` 请求来获取消息数据。`Consumer` 可以以两种模式启动—— **广播Broadcast和集群Cluster**。广播模式下,一条消息会发送给 **同一个消费组中的所有消费者** ,集群模式下消息只会发送给一个消费者。
## RocketMQ功能特性
### 消息
#### 普通消息
普通消息一般应用于微服务解耦、事件驱动、数据集成等场景这些场景大多数要求数据传输通道具有可靠传输的能力且对消息的处理时机、处理顺序没有特别要求。以在线的电商交易场景为例上游订单系统将用户下单支付这一业务事件封装成独立的普通消息并发送至RocketMQ服务端下游按需从服务端订阅消息并按照本地消费逻辑处理下游任务。每个消息之间都是相互独立的且不需要产生关联。另外还有日志系统以离线的日志收集场景为例通过埋点组件收集前端应用的相关操作日志并转发到 RocketMQ 。
![](https://rocketmq.apache.org/zh/assets/images/lifecyclefornormal-e8a2a7e42a0722f681eb129b51e1bd66.png)
**普通消息生命周期**
- 初始化:消息被生产者构建并完成初始化,待发送到服务端的状态。
- 待消费:消息被发送到服务端,对消费者可见,等待消费者消费的状态。
- 消费中:消息被消费者获取,并按照消费者本地的业务逻辑进行处理的过程。 此时服务端会等待消费者完成消费并提交消费结果如果一定时间后没有收到消费者的响应RocketMQ会对消息进行重试处理。
- 消费提交消费者完成消费处理并向服务端提交消费结果服务端标记当前消息已经被处理包括消费成功和失败。RocketMQ默认支持保留所有消息此时消息数据并不会立即被删除只是逻辑标记已消费。消息在保存时间到期或存储空间不足被删除前消费者仍然可以回溯消息重新消费。
- 消息删除RocketMQ按照消息保存机制滚动清理最早的消息数据将消息从物理文件中删除。
#### 定时消息
在分布式定时调度触发、任务超时处理等场景需要实现精准、可靠的定时事件触发。使用RocketMQ 的定时消息可以简化定时调度任务的开发逻辑,实现高性能、可扩展、高可靠的定时触发能力。定时消息仅支持在 MessageType为Delay 的主题内使用,即定时消息只能发送至类型为定时消息的主题中,发送的消息的类型必须和主题的类型一致。
基于定时消息的超时任务处理具备如下优势:
- **精度高、开发门槛低**:基于消息通知方式不存在定时阶梯间隔。可以轻松实现任意精度事件触发,无需业务去重。
- **高性能可扩展**传统的数据库扫描方式较为复杂需要频繁调用接口扫描容易产生性能瓶颈。RocketMQ 的定时消息具有高并发和水平扩展的能力。
![](https://rocketmq.apache.org/zh/assets/images/lifecyclefordelay-2ce8278df69cd026dd11ffd27ab09a17.png)
**定时消息生命周期**
- 初始化:消息被生产者构建并完成初始化,待发送到服务端的状态。
- 定时中:消息被发送到服务端,和普通消息不同的是,服务端不会直接构建消息索引,而是会将定时消息**单独存储在定时存储系统中**,等待定时时刻到达。
- 待消费:定时时刻到达后,服务端将消息重新写入普通存储引擎,对下游消费者可见,等待消费者消费的状态。
- 消费中:消息被消费者获取,并按照消费者本地的业务逻辑进行处理的过程。 此时服务端会等待消费者完成消费并提交消费结果如果一定时间后没有收到消费者的响应RocketMQ会对消息进行重试处理。
- 消费提交消费者完成消费处理并向服务端提交消费结果服务端标记当前消息已经被处理包括消费成功和失败。RocketMQ 默认支持保留所有消息,此时消息数据并不会立即被删除,只是逻辑标记已消费。消息在保存时间到期或存储空间不足被删除前,消费者仍然可以回溯消息重新消费。
- 消息删除Apache RocketMQ按照消息保存机制滚动清理最早的消息数据将消息从物理文件中删除。
定时消息的实现逻辑需要先经过定时存储等待触发,定时时间到达后才会被投递给消费者。因此,如果将大量定时消息的定时时间设置为同一时刻,则到达该时刻后会有大量消息同时需要被处理,会造成系统压力过大,导致消息分发延迟,影响定时精度。
#### 顺序消息
顺序消息仅支持使用MessageType为FIFO的主题即顺序消息只能发送至类型为顺序消息的主题中发送的消息的类型必须和主题的类型一致。和普通消息发送相比顺序消息发送必须要设置消息组。推荐实现MessageQueueSelector的方式见下文。要保证消息的顺序性需要单一生产者串行发送。
单线程使用MessageListenerConcurrently可以顺序消费多线程环境下使用MessageListenerOrderly才能顺序消费。
#### 事务消息
施工中。。。
## 关于发送消息
### **不建议单一进程创建大量生产者**
@ -293,6 +343,10 @@ for (int i =0;i<n;i++){
p.shutdown();
```
## 消费者分类
## 消费者分组和生产者分组
### 生产者分组
@ -309,7 +363,9 @@ RocketMQ 服务端5.x版本开始**生产者是匿名的**,无需管理生
- 投递顺序性Apache RocketMQ 的服务端将消息投递给消费者消费时,支持顺序投递和并发投递,投递方式在消费者分组中统一配置。
- 消费重试策略: 消费者消费消息失败时的重试策略,包括重试次数、死信队列设置等。
RocketMQ 服务端5.x版本上述消费者的消费行为从关联的消费者分组中统一获取因此同一分组内所有消费者的消费行为必然是一致的客户端无需关注。
RocketMQ 服务端3.x/4.x历史版本上述消费逻辑由消费者客户端接口定义因此您需要自己在消费者客户端设置时保证同一分组下的消费者的消费行为一致。[来自官方网站]
## 如何解决顺序消费和重复消费?