mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
消费者分组和生产者分组相关知识补充
This commit is contained in:
parent
8d9856af64
commit
07c6e875da
@ -196,6 +196,8 @@ tag:
|
|||||||
|
|
||||||
你可以看到图中生产者组中的生产者会向主题发送消息,而 **主题中存在多个队列**,生产者每次生产消息之后是指定主题中的某个队列发送消息的。
|
你可以看到图中生产者组中的生产者会向主题发送消息,而 **主题中存在多个队列**,生产者每次生产消息之后是指定主题中的某个队列发送消息的。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
每个主题中都有多个队列(分布在不同的 `Broker`中,如果是集群的话,`Broker`又分布在不同的服务器中),集群消费模式下,一个消费者集群多台机器共同消费一个 `topic` 的多个队列,**一个队列只会被一个消费者消费**。如果某个消费者挂掉,分组内其它消费者会接替挂掉的消费者继续消费。就像上图中 `Consumer1` 和 `Consumer2` 分别对应着两个队列,而 `Consumer3` 是没有队列对应的,所以一般来讲要控制 **消费者组中的消费者个数和主题中队列个数相同** 。
|
每个主题中都有多个队列(分布在不同的 `Broker`中,如果是集群的话,`Broker`又分布在不同的服务器中),集群消费模式下,一个消费者集群多台机器共同消费一个 `topic` 的多个队列,**一个队列只会被一个消费者消费**。如果某个消费者挂掉,分组内其它消费者会接替挂掉的消费者继续消费。就像上图中 `Consumer1` 和 `Consumer2` 分别对应着两个队列,而 `Consumer3` 是没有队列对应的,所以一般来讲要控制 **消费者组中的消费者个数和主题中队列个数相同** 。
|
||||||
|
|
||||||
当然也可以消费者个数小于队列个数,只不过不太建议。如下图。
|
当然也可以消费者个数小于队列个数,只不过不太建议。如下图。
|
||||||
@ -270,6 +272,45 @@ tag:
|
|||||||
|
|
||||||
第四、消费者通过 `NameServer` 获取所有 `Broker` 的路由信息后,向 `Broker` 发送 `Pull` 请求来获取消息数据。`Consumer` 可以以两种模式启动—— **广播(Broadcast)和集群(Cluster)**。广播模式下,一条消息会发送给 **同一个消费组中的所有消费者** ,集群模式下消息只会发送给一个消费者。
|
第四、消费者通过 `NameServer` 获取所有 `Broker` 的路由信息后,向 `Broker` 发送 `Pull` 请求来获取消息数据。`Consumer` 可以以两种模式启动—— **广播(Broadcast)和集群(Cluster)**。广播模式下,一条消息会发送给 **同一个消费组中的所有消费者** ,集群模式下消息只会发送给一个消费者。
|
||||||
|
|
||||||
|
## 关于发送消息
|
||||||
|
|
||||||
|
### **不建议单一进程创建大量生产者**
|
||||||
|
|
||||||
|
Apache RocketMQ 的生产者和主题是多对多的关系,支持同一个生产者向多个主题发送消息。对于生产者的创建和初始化,建议遵循够用即可、最大化复用原则,如果有需要发送消息到多个主题的场景,无需为每个主题都创建一个生产者。
|
||||||
|
|
||||||
|
### **不建议频繁创建和销毁生产者**
|
||||||
|
|
||||||
|
Apache RocketMQ 的生产者是可以重复利用的底层资源,类似数据库的连接池。因此不需要在每次发送消息时动态创建生产者,且在发送结束后销毁生产者。这样频繁的创建销毁会在服务端产生大量短连接请求,严重影响系统性能。
|
||||||
|
|
||||||
|
正确示例:
|
||||||
|
|
||||||
|
```java
|
||||||
|
Producer p = ProducerBuilder.build();
|
||||||
|
for (int i =0;i<n;i++){
|
||||||
|
Message m= MessageBuilder.build();
|
||||||
|
p.send(m);
|
||||||
|
}
|
||||||
|
p.shutdown();
|
||||||
|
```
|
||||||
|
|
||||||
|
## 消费者分组和生产者分组
|
||||||
|
|
||||||
|
### 生产者分组
|
||||||
|
|
||||||
|
RocketMQ 服务端5.x版本开始,**生产者是匿名的**,无需管理生产者分组(ProducerGroup);对于历史版本服务端3.x和4.x版本,已经使用的生产者分组可以废弃无需再设置,且不会对当前业务产生影响。
|
||||||
|
|
||||||
|
### 消费者分组
|
||||||
|
|
||||||
|
消费者分组是多个消费行为一致的消费者的负载均衡分组。消费者分组不是具体实体而是一个逻辑资源。通过消费者分组实现消费性能的水平扩展以及高可用容灾。
|
||||||
|
|
||||||
|
消费者分组中的订阅关系、投递顺序性、消费重试策略是一致的。
|
||||||
|
|
||||||
|
- 订阅关系:Apache RocketMQ 以消费者分组的粒度管理订阅关系,实现订阅关系的管理和追溯。
|
||||||
|
- 投递顺序性:Apache RocketMQ 的服务端将消息投递给消费者消费时,支持顺序投递和并发投递,投递方式在消费者分组中统一配置。
|
||||||
|
- 消费重试策略: 消费者消费消息失败时的重试策略,包括重试次数、死信队列设置等。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 如何解决顺序消费和重复消费?
|
## 如何解决顺序消费和重复消费?
|
||||||
|
|
||||||
其实,这些东西都是我在介绍消息队列带来的一些副作用的时候提到的,也就是说,这些问题不仅仅挂钩于 `RocketMQ` ,而是应该每个消息中间件都需要去解决的。
|
其实,这些东西都是我在介绍消息队列带来的一些副作用的时候提到的,也就是说,这些问题不仅仅挂钩于 `RocketMQ` ,而是应该每个消息中间件都需要去解决的。
|
||||||
|
Loading…
x
Reference in New Issue
Block a user