云原生中间件RocketMQ-消费者核心参数、消费模式之集群模式

2022-11-28 15:52:34 浏览数 (2)

文章目录

    • PushConsumer核心参数详解
    • PushConsumer消费模式-集群模式

PushConsumer核心参数详解

  1. consumeFromWhere:消费者从那个位置开始消费
  • CONSUME_FROM_LAST_OFFSET:第一次启动从队列最后位置消费,后续再启动接着上次消费的进度开始消费
  • CONSUME_FROM_FIRST_OFFSET:第一次启动从队列初始位置消费,后续再启动接着上次消费的进度开始消费
  • CONSUME_FROM_TIMESTAMP:第一次启动从指定时间点位置消费,后续再启动接着上次消费的进度开始消费
  1. allocateMessageQueueStrategy:消息分配策略(集群模式),指定如何将消息队列分配给每个客户端。包括一致性hash、平均分配、平均轮询分配、自定义消费队列、按机房hash算法实现。默认平均轮询AllocateMessageQueueAveragely,Rebalance(轮询)算法实现策略。

平均分配的实现算法

  • 如果消费者的个数可以除尽队列的个数,那么就完全平均分。
  • 如果不能除尽。那么靠前的消费者多消费一个队列,靠后的消费平均数个队列。
  • 如果消费者的个数大于队列的个数,那么靠前的消费者消费一个队列,后面的不消费。
  1. subscription:订阅关系。
  1. offsetStore: 消息进度存储。
  • 集群消费:从远程Broker获取。
  • 广播消费:从本地文件获取。
  1. consumeThreadMin/consumeThreadMax:最小消费线程数,最大消费线程数,默认都是20。
  1. consumeTimeout:消息阻塞使用线程的最长时间(以分钟为单位),默认15。
  2. pullThresholdSizeForQueue:在队列级别限制缓存的消息大小,默认情况下每个消息队列最多缓存100MiB消息。
  3. consumeConcurrentlyMaxSpan / pullThresholdForQueue: 单队列并行消费允许的最大跨度,默认值2000, 队列级别的流量控制阈值,拉消息本地队列缓存消息最大数,默认1000。
  4. pullInterval: 消息拉取时间间隔,由于是长轮询,所以为0,但是如果应用为了流控,也可以设置大于0的值,单位毫秒,默认0。
  5. pullBatchSize: 批量拉消息,一次最多拉多少条,默认32。
  6. consumeMessageBatchMaxSize: 批量消费,一次消费多少条消息,默认1。
  7. maxReconsumeTimes:最大重试次数,并行模式下默认-1也就是16次,顺序模式下默认-1表示Integer.MAX_VALUE。
  1. awaitTerminationMillisWhenShutdown:当关闭消费者时等待消息消耗的最大时间,0表示没有等待。默认0。
  2. messageModel:消息模型定义了将消息传递到每个客户端的方式,默认集群模式。

PushConsumer消费模式-集群模式

GroupName用于把多个Consumer组织到一起,相同GroupName的Consumer只消费所订阅消息的一部分。 目的:达到天然的负载均衡机制。发消息队列数要和consumer数量为倍数,才能平均负载均衡。 消费者采用负载均衡(集群模式)方式消费消息,一个分组(Group)下的多个消费者共同消费队列消息,每个消费者处理的消息不同。一个Consumer Group中的各个Consumer实例分摊去消费消息,即一条消息只会投递到一个Consumer Group下面的一个实例。例如某个Topic有3个队列,其中一个Consumer Group 有 3 个实例,那么每个实例只消费其中的1个队列。集群消费模式是消费者默认的消费方式。 集群模式: 使用相同 Group ID 的订阅者属于同一个集群。 同一个集群下的订阅者消费逻辑必须完全一致(包括 Tag 的使用) , 这些订阅者在逻辑上可以认为是一个消费节点。

消费端通过如下代码指定消费模式:

代码语言:javascript复制
// 消费模式 默认是集群模式(负载均衡模式),还有是广播模式
consumer.setMessageModel(MessageModel.CLUSTERING);

集群模式下,每个消费者消费的肯定不是同一个消息。

集群模式下每一个queue都只能被一个消费者消费,但是每一个消费者都可以消费多个queue。

集群模式适用场景&注意事项:

  • 消费端集群化部署, 每条消息只需要被处理一次;
  • 由于消费进度在服务端维护, 可靠性更高。
  • Topic Tag下的消息可以保证肯定会被整个集群至少消费一次 ;
  • 不保证每一次失败重投的消息路由到同一台机器上, 因此处理消息时不应该做任何确定性假设。
  • 集群中的每个消费者消费的消息肯定不会是同一条消息,因为实际上在集群模式下
    • 每一个queue都只能被一个消费者消费
    • 但是每一个消费者都可以消费多个queue

本文内容到此结束了, 如有收获欢迎点赞

0 人点赞