Skip to content

Commit 07c6e87

Browse files
committed
消费者分组和生产者分组相关知识补充
1 parent 8d9856a commit 07c6e87

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

docs/high-performance/message-queue/rocketmq-questions.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,8 @@ tag:
196196

197197
你可以看到图中生产者组中的生产者会向主题发送消息,而 **主题中存在多个队列**,生产者每次生产消息之后是指定主题中的某个队列发送消息的。
198198

199+
200+
199201
每个主题中都有多个队列(分布在不同的 `Broker`中,如果是集群的话,`Broker`又分布在不同的服务器中),集群消费模式下,一个消费者集群多台机器共同消费一个 `topic` 的多个队列,**一个队列只会被一个消费者消费**。如果某个消费者挂掉,分组内其它消费者会接替挂掉的消费者继续消费。就像上图中 `Consumer1``Consumer2` 分别对应着两个队列,而 `Consumer3` 是没有队列对应的,所以一般来讲要控制 **消费者组中的消费者个数和主题中队列个数相同**
200202

201203
当然也可以消费者个数小于队列个数,只不过不太建议。如下图。
@@ -270,6 +272,45 @@ tag:
270272

271273
第四、消费者通过 `NameServer` 获取所有 `Broker` 的路由信息后,向 `Broker` 发送 `Pull` 请求来获取消息数据。`Consumer` 可以以两种模式启动—— **广播(Broadcast)和集群(Cluster)**。广播模式下,一条消息会发送给 **同一个消费组中的所有消费者** ,集群模式下消息只会发送给一个消费者。
272274

275+
## 关于发送消息
276+
277+
### **不建议单一进程创建大量生产者**
278+
279+
Apache RocketMQ 的生产者和主题是多对多的关系,支持同一个生产者向多个主题发送消息。对于生产者的创建和初始化,建议遵循够用即可、最大化复用原则,如果有需要发送消息到多个主题的场景,无需为每个主题都创建一个生产者。
280+
281+
### **不建议频繁创建和销毁生产者**
282+
283+
Apache RocketMQ 的生产者是可以重复利用的底层资源,类似数据库的连接池。因此不需要在每次发送消息时动态创建生产者,且在发送结束后销毁生产者。这样频繁的创建销毁会在服务端产生大量短连接请求,严重影响系统性能。
284+
285+
正确示例:
286+
287+
```java
288+
Producer p = ProducerBuilder.build();
289+
for (int i =0;i<n;i++){
290+
Message m= MessageBuilder.build();
291+
p.send(m);
292+
}
293+
p.shutdown();
294+
```
295+
296+
## 消费者分组和生产者分组
297+
298+
### 生产者分组
299+
300+
RocketMQ 服务端5.x版本开始,**生产者是匿名的**,无需管理生产者分组(ProducerGroup);对于历史版本服务端3.x和4.x版本,已经使用的生产者分组可以废弃无需再设置,且不会对当前业务产生影响。
301+
302+
### 消费者分组
303+
304+
消费者分组是多个消费行为一致的消费者的负载均衡分组。消费者分组不是具体实体而是一个逻辑资源。通过消费者分组实现消费性能的水平扩展以及高可用容灾。
305+
306+
消费者分组中的订阅关系、投递顺序性、消费重试策略是一致的。
307+
308+
- 订阅关系:Apache RocketMQ 以消费者分组的粒度管理订阅关系,实现订阅关系的管理和追溯。
309+
- 投递顺序性:Apache RocketMQ 的服务端将消息投递给消费者消费时,支持顺序投递和并发投递,投递方式在消费者分组中统一配置。
310+
- 消费重试策略: 消费者消费消息失败时的重试策略,包括重试次数、死信队列设置等。
311+
312+
313+
273314
## 如何解决顺序消费和重复消费?
274315

275316
其实,这些东西都是我在介绍消息队列带来的一些副作用的时候提到的,也就是说,这些问题不仅仅挂钩于 `RocketMQ` ,而是应该每个消息中间件都需要去解决的。

0 commit comments

Comments
 (0)