【RocketMQ】9.负载均衡,消息重试

负载均衡

Rroducer负载均衡

Producer端,每个实例在发消息的时候,默认会轮询所有的message queue发送,以达到让消息平均落在不同的queue上。而由于queue可以散落在不同的brocker,所以消息会发送到不同的brocker下
在这里插入图片描述
图中箭头线条上的标号代表顺序,发布方会把第一条消息发送至Queue 0,然后第二条消息发送至Queue1,以此类推。

Consumer负载均衡

集群模式
在集群消费模式下,每条消息只需要投递到订阅这个topic的Consumer Group下的一个实例即可。RocketMQ采用主动拉取的方式拉取并消费消息,在拉取的时候需要明确拉取哪一条message queue

而每当实例的数量有更变,都会触发一次所有实例的负载均衡,这时候会按照queue的数量和实例的数量平均分配queue给每个实例

默认的分配算法是AllocateMessageQueueAvergely,如下图
在这里插入图片描述
还有另外一种平均非大算法是AllocateMessageQueueAveragelyByCircle,也就是平均分摊每一条queue,只是以换装轮流分queue的形式,如下图
在这里插入图片描述
需要注意的是,集群模式下,queue都是只允许分配只一个实例,这是由于如果多个实例同时消费一个queue的消息,由于拉取哪些消息是consumer主动空指的,那样会导致同一个消息在不同的实例下被消费多次,所以算法上都是一个queue之分给一个consumer实例,一个consumer实例可以允许同时分到不用的queue

通过增加consumer实例去分摊queue消费,可以起到水平扩展的消费能力的作用。而有实例下线的时候,会重新触发负载均衡,这时候员来分配到的queue将分配到其他实例上继续消费

但是如果consumer实例的数量比message queue的数量总数量还多的化,多出来的consumer实例将无法分到queue,也就是无法消费到消息,也就无法起到分摊负载的作用了,所以需要控制让queue的总数量大于等于consumer的数量

广播模式
由于广播莫i是下要求一条消息需要投递到一个消费组下面所有的消费者实例,所以也就没有消息被分摊消费的说法。在现实上,其中一个不同就是在consumer分配queue的时候,所有的consumer都分到所有的queue
在这里插入图片描述

消息重试

顺序消息的重试

对于顺序消息,当消费者消费消息失败后,消息队列RocketMQ会自动不断进行消息重试(每次间隔时间为1秒),这时,应用会出现消息消费被阻塞的情况。因此,在使用顺序消息时,务必保证应用能够即时监控并处理消费失败的情况,避免阻塞现象的发生

无序消息的重试

对于无须消息(普通,定时,延时,事务消息),当消费者消费消息失败时,你可以通过设置返回状态达到消息重试的结果。无需消息的重试只针对集群消费方式生效;广播方式不提供失败重试特性,即消费失败后,失败消息不再重试,继续消费新的消息

重试次数
消息队列RocketMQ默认允许每条消息最多重试16次,每次重试的间隔时间如下
在这里插入图片描述
如果消息重试16次后仍然失败,消息将不再投递。如果严格按照上述重试时间间隔计算,某条消息在一直消费失败的前提下,将会在接下来的4小时46分钟之内进行16次重试,超过这个时间范围消息将不再重试投递

注意:一条消息无论重试多少次,这些重试消息的MessageID不会改变

配置方式
消费失败后,重试配置方式
集群消费方式下,消息消费失败后期望消息重试,需要在消息监听器接口的视线中明确进行配置(三种方式任选一种)

  • 返回 Action.ReconsumerLater(推荐)
  • 返回Null
  • 抛出异常
    在这里插入图片描述
    消费失败后,不重试配置方式
    集群消费方式下,消息失败后期望消息不充实,需要捕获消费逻辑中可能抛出的异常,最终返回Action.CommitMessage,此后这条消息将不会在重试
    在这里插入图片描述
    自定义消息最大重试次数
    消息队列RocketMQ 允许Consumer启动的时候设置最大重试次数,重试时间间隔将按照如下策略
  • 最大重试册数小于等于16次,则重试时间间隔同上表描述
  • 最大重试次数的大于16次,超过16次的重试时间间隔均为2小时
    在这里插入图片描述
    注意:
  • 消息最大重试次数的设置对相同时间Group ID 下的所有Consumer实例有效
  • 如果只对相同GroupID 下两个Consumer实例中的其中一个设置了MaxReconsumerTimes,那么改配置对两个Consumer实例均生效
  • 配置采用覆盖的方式生效,即最后启动的Consumer实例会覆盖之前启动实例的配置

获取消息重试次数
消费者收到消息后,可按照如下方式获取消息的重试次数
在这里插入图片描述