文章目录
-
- PushConsumer核心参数详解
- PushConsumer消费模式-集群模式
PushConsumer核心参数详解
consumeFromWhere
:消费者从那个位置开始消费
- CONSUME_FROM_LAST_OFFSET:第一次启动从队列最后位置消费,后续再启动接着上次消费的进度开始消费
- CONSUME_FROM_FIRST_OFFSET:第一次启动从队列初始位置消费,后续再启动接着上次消费的进度开始消费
- CONSUME_FROM_TIMESTAMP:第一次启动从指定时间点位置消费,后续再启动接着上次消费的进度开始消费
allocateMessageQueueStrategy
:消息分配策略(集群模式),指定如何将消息队列分配给每个客户端。包括一致性hash、平均分配、平均轮询分配、自定义消费队列、按机房hash算法实现。默认平均轮询AllocateMessageQueueAveragely,Rebalance(轮询)算法实现策略。
平均分配的实现算法
- 如果消费者的个数可以除尽队列的个数,那么就完全平均分。
- 如果不能除尽。那么靠前的消费者多消费一个队列,靠后的消费平均数个队列。
- 如果消费者的个数大于队列的个数,那么靠前的消费者消费一个队列,后面的不消费。
subscription
:订阅关系。
offsetStore
: 消息进度存储。
- 集群消费:从远程Broker获取。
- 广播消费:从本地文件获取。
-
consumeThreadMin/consumeThreadMax
:最小消费线程数,最大消费线程数,默认都是20。
-
consumeTimeout
:消息阻塞使用线程的最长时间(以分钟为单位),默认15。 -
pullThresholdSizeForQueue
:在队列级别限制缓存的消息大小,默认情况下每个消息队列最多缓存100MiB消息。 -
consumeConcurrentlyMaxSpan / pullThresholdForQueue
: 单队列并行消费允许的最大跨度,默认值2000, 队列级别的流量控制阈值,拉消息本地队列缓存消息最大数,默认1000。 -
pullInterval
: 消息拉取时间间隔,由于是长轮询,所以为0,但是如果应用为了流控,也可以设置大于0的值,单位毫秒,默认0。 -
pullBatchSize
: 批量拉消息,一次最多拉多少条,默认32。 -
consumeMessageBatchMaxSize
: 批量消费,一次消费多少条消息,默认1。 -
maxReconsumeTimes
:最大重试次数,并行模式下默认-1也就是16次,顺序模式下默认-1表示Integer.MAX_VALUE。
-
awaitTerminationMillisWhenShutdown
:当关闭消费者时等待消息消耗的最大时间,0表示没有等待。默认0。 -
messageModel
:消息模型定义了将消息传递到每个客户端的方式,默认集群模式。
PushConsumer消费模式-集群模式
GroupName用于把多个Consumer组织到一起,相同GroupName的Consumer只消费所订阅消息的一部分。
目的:达到天然的负载均衡机制。发消息队列数要和consumer数量为倍数,才能平均负载均衡。
消费者采用负载均衡(集群模式)方式消费消息,一个分组(Group)下的多个消费者共同消费队列消息,每个消费者处理的消息不同。一个Consumer Group中的各个Consumer实例分摊去消费消息,即一条消息只会投递到一个Consumer Group下面的一个实例。例如某个Topic有3个队列,其中一个Consumer Group 有 3 个实例,那么每个实例只消费其中的1个队列。集群消费模式是消费者默认的消费方式。
集群模式: 使用相同 Group ID 的订阅者属于同一个集群。 同一个集群下的订阅者消费逻辑必须完全一致(包括 Tag 的使用) , 这些订阅者在逻辑上可以认为是一个消费节点。
消费端通过如下代码指定消费模式:
// 消费模式 默认是集群模式(负载均衡模式),还有是广播模式
consumer.setMessageModel(MessageModel.CLUSTERING);
集群模式下,每个消费者消费的肯定不是同一个消息。
集群模式下每一个queue都只能被一个消费者消费,但是每一个消费者都可以消费多个queue。
集群模式适用场景&注意事项:
- 消费端集群化部署, 每条消息只需要被处理一次;
- 由于消费进度在服务端维护, 可靠性更高。
- Topic + Tag下的消息可以保证肯定会被整个集群至少消费一次 ;
- 不保证每一次失败重投的消息路由到同一台机器上, 因此处理消息时不应该做任何确定性假设。
- 集群中的每个消费者消费的消息肯定不会是同一条消息,因为实际上在集群模式下
- 每一个queue都只能被一个消费者消费
- 但是每一个消费者都可以消费多个queue
本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位大佬指出。
主页:共饮一杯无的博客汇总👨💻保持热爱,奔赴下一场山海。🏃🏃🏃