RocketMQ(4.8.0)——默认的两种消费者核心属性和方法
RocketMQ客户端有两个独立的消费者实现类:org.apache.rocketmq.client.consumer.DefaultMQPullConsumer 和 org.apache.rocketmq.client.consumer.DefaultMQPushConsumer。
下面分别对这2种类进行介绍:
1.1 DefaultMQPullConsumer
该消费者使用时需要用户主动从 Broker 中 Pull 消息和消费消息,提交消费位点。DefaultMQPullConsumer 的类图继承关系如图所示:
可以看到,DefaultMQPullConsumer 实现时包含消费者的操作和属性配置,这是一个典型的类对象设计。下面我们介绍一些核心属性和方法。
namesrvAddr:继承自 ClientConfig,表示 RocketMQ 集群的 Namesrv 地址,如果是多个,则用分号分开。比如:127.0.0.1:9876;127.0.0.2:9876。
clientIP:使用客户端的程序所在机器的 IP 地址,目前支持 IPv4 和 IPv6,同时排除了本地环回接口(127.0.x.x)和私有内网地址(192.168.x.x)。如果在 Docker 中运行,获取的 IP 地址是容器所在的 IP 地址,而非宿主主机的 IP 地址。
instanceName:客户端实例名称,客户端创建的多个Producer、Consumer实际是共用一个内部实例(这个实例包含网络连接、线程资源等)。假如要在同一个机器上部署多个程序进程,那么每个进程的实例名都必须不相同,否则程序会启动失败。
vipChannelEnabled:这是一个 boolean 值,表示是否开启 VIP 通道。VIP 通道和非 VIP 通道的区别是使用不同的端口号进行通信。
clientCallbackExecutorThreads:客户端回调线程数。该线程数等于 Netty 通信层回调线程的个数。默认值为 Runtime.getRuntime().availableProcessors(),表示当前有效的CPU个数。
pollNameServerInterval:获取 Topic 路由信息间隔,单位为ms,默认为30 000ms。
heartbeatBrokerInterval:客户端和 Broker 心跳间隔,单位为ms,默认为30 000ms。
persistConsumerOffsetInterval:持久化消费位点时间间隔,单位为ms,默认为5000ms。
defaultMQPullConsumerImpl:默认Pull消费者的具体实现。
consumerGroup:消费者组名字。
brokerSuspendMaxTimeMills:在长轮询模式下,Broker 的最大挂起请求时间,建议不要修改此值。
consumerTimeoutMillsWhenSuspend:在长轮询模式下,消费者的最大请求超时时间,必须比 brokerSuspendMaxTimeMills 要大,不建议修改此值。
consumerPullTimeoutMills:消费者 Pull 消息时 Socket 的超时时间。
messageModel:消费模式,现在支持集群模式消费和广播模式消费。
messageQueueListener:消息路由信息变化时回调处理监听器,一般在重新平衡时会被调用。
offsetStore:位点存储模块。集群模式位点会持久化到 Broker 中,广播模式持久化到本地文件中,位点存储模块有两个实现类:RemoteBrokerOffsetStore 和 LocalFileOffsetStore。
allocateMessageQueueStrategy:消费Queue分配策略管理器。
maxReconsumeTimes:最大重试次数,可以配置。
下面介绍一些核心方法。由于生产者消费者都继承了 MQAdmin 接口,所以管理相关的接口都是一样的,不再赘述。
registerMessageQueueListener():注册队列变化监听器,当队列发生变化时会被监听到。
pull():从 Broker 中 Pull 消息,如果有PullCallback参数,则表示异步拉取。
pullBlockIfNotFound():长轮询方式拉取。如果没有拉取到消息,那么 Broker 会将请求 Hold 住一段时间。
updateConsumeOffset(final MessageQueue mq,final long offset):更新某一个 Queue 的消费位点。
fetchConsumeOffset(final MessageQueue mq, final boolean fromStore):查找某个 Queue 的消费点。
sendMessageBack(MessageExt msg, init delayLevel, String brokerName, String consumerGroup):如果消费发送失败,则可以将消息重新发回给 Broker,这个消息者组延迟一段时间后可以再消费(也就是重试)。
fetchSubscribeMessageQueues(final String topic):获取一个 Topic 的全部 Queue 信息。
1.2 DefaultMQPushConsumer
DefaultMQPushConsumer的大部分属性、方法和DefaultMQPullConsumer是一样的,下面说下其核心属性和方法。
DefaultMQPushConsumerImpl:默认的 Push 消费者具体实现类。
consumeFromWhere:一个枚举,表示从什么位点开始消费。
(1)CONSUME_FROM_LAST_OFFSET:从上次消费的位点开始消费,相当于断点继续。
(2)CONSUME_FROM_FIRST_OFFSET:从 ConsumeQueue 的最小位点开始消费。
(3)CONSUME_FROM_TIMESTAMP:从指定时间开始消费。
consumeTimestamp:表示从哪一时刻开始消费,格式为 yyyyMMDDHHmmss,默认为半小时前。当 consumeFromWhere = consumeTimestamp 时,consumeTimestamp 设置的值才生效。
allocateMessageQueueStrategy:消费者订阅 topic-queue 策略。
subscription:订阅关系,表示当前消费者订阅了哪些 Topic 的哪些 Tag。
messageListener:消息 Push 回调监听器。
consumeThreadMin:最小消费线程数,必须小于 consumeThreadMax。
consumeThreadMax:最大消费线程数,必须大于 consumeThreadMin。
adjustThreadPoolNumsThreshold:动态调整消费线程池的线程数大小,开源版本不支持该功能。
consumeConcurrentlyMaxSpan:并发消息的最大位点差。如果 Pull 消息的位点差超过该值,拉取变慢。
pullThresholdForQueue:一个 Queue 能缓存的最大消息数。超过该值则采取拉取流控措施。
pullThresholdSizeForQueue:一个 Queue 最大能缓存的消息字节数,单位是MB。
pullThresholdForTopic:一个 Queue 最大能缓存的消息字节数,单位是MB。默认为-1,结合 pullThresholdForQueue 配置项生效,该配置项的优先级低于 pullThresholdForQueue。
pullInterval:拉取间隔,单位为ms。
consumeMessageBatchMaxSize:消费者每次批量消费时,最多消费多少条消息。
pullBatchSize:一次最多拉取多少条消息。
postSubscriptionWhenPull:每次拉取消息时是否更新订阅关系,该方法的返回值默认为False。
maxReconsumeTimes:最大重试次数,该函数返回值默认为-1,表示默认最大重试次数为16。
suspendCurrentQueueTimeMillis:为短轮询场景设置的挂起时间,比如顺序消息场景。
consumeTimeout:消费超时时间,单位为min,默认值为15min。