博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RocketMQ 负载均衡,消息重试
阅读量:2169 次
发布时间:2019-05-01

本文共 1945 字,大约阅读时间需要 6 分钟。

负载均衡

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实例会覆盖之前启动实例的配置

获取消息重试次数

消费者收到消息后,可按照如下方式获取消息的重试次数

转载地址:http://xhxzb.baihongyu.com/

你可能感兴趣的文章
为什么在优化算法中使用指数加权平均
查看>>
什么是 Q-learning
查看>>
用一个小游戏入门深度强化学习
查看>>
如何应用 BERT :Bidirectional Encoder Representations from Transformers
查看>>
5 分钟入门 Google 最强NLP模型:BERT
查看>>
强化学习第1课:像学自行车一样的强化学习
查看>>
强化学习第2课:强化学习,监督式学习,非监督式学习的区别
查看>>
强化学习第3课:有些问题就像个赌局
查看>>
强化学习第4课:这些都可以抽象为一个决策过程
查看>>
强化学习第5课:什么是马尔科夫决策过程
查看>>
强化学习第6课:什么是 Crossentropy 方法
查看>>
强化学习第7课:交叉熵方法的一些局限性
查看>>
强化学习 8: approximate reinforcement learning
查看>>
图解什么是 Transformer
查看>>
代码实例:如何使用 TensorFlow 2.0 Preview
查看>>
6 种用 LSTM 做时间序列预测的模型结构 - Keras 实现
查看>>
走进JavaWeb技术世界1:JavaWeb的由来和基础知识
查看>>
走进JavaWeb技术世界2:JSP与Servlet的曾经与现在
查看>>
走进JavaWeb技术世界3:JDBC的进化与连接池技术
查看>>
走进JavaWeb技术世界4:Servlet 工作原理详解
查看>>