File tree Expand file tree Collapse file tree 1 file changed +41
-0
lines changed
docs/high-performance/message-queue Expand file tree Collapse file tree 1 file changed +41
-0
lines changed Original file line number Diff line number Diff line change 196
196
197
197
你可以看到图中生产者组中的生产者会向主题发送消息,而 ** 主题中存在多个队列** ,生产者每次生产消息之后是指定主题中的某个队列发送消息的。
198
198
199
+
200
+
199
201
每个主题中都有多个队列(分布在不同的 ` Broker ` 中,如果是集群的话,` Broker ` 又分布在不同的服务器中),集群消费模式下,一个消费者集群多台机器共同消费一个 ` topic ` 的多个队列,** 一个队列只会被一个消费者消费** 。如果某个消费者挂掉,分组内其它消费者会接替挂掉的消费者继续消费。就像上图中 ` Consumer1 ` 和 ` Consumer2 ` 分别对应着两个队列,而 ` Consumer3 ` 是没有队列对应的,所以一般来讲要控制 ** 消费者组中的消费者个数和主题中队列个数相同** 。
200
202
201
203
当然也可以消费者个数小于队列个数,只不过不太建议。如下图。
@@ -270,6 +272,45 @@ tag:
270
272
271
273
第四、消费者通过 ` NameServer ` 获取所有 ` Broker ` 的路由信息后,向 ` Broker ` 发送 ` Pull ` 请求来获取消息数据。` Consumer ` 可以以两种模式启动—— ** 广播(Broadcast)和集群(Cluster)** 。广播模式下,一条消息会发送给 ** 同一个消费组中的所有消费者** ,集群模式下消息只会发送给一个消费者。
272
274
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
+
273
314
## 如何解决顺序消费和重复消费?
274
315
275
316
其实,这些东西都是我在介绍消息队列带来的一些副作用的时候提到的,也就是说,这些问题不仅仅挂钩于 ` RocketMQ ` ,而是应该每个消息中间件都需要去解决的。
You can’t perform that action at this time.
0 commit comments