当前位置: 首页 > java >正文

RocketMQ 负载均衡,消息重试

负载均衡

Rroducer负载均衡

Producer端,每个实例在发消息的时候,默认会轮询所有的message queue发送,以达到让消息平均落在不同的queue上。而由于queue可以散落在不同的brocker,所以消息会发送到不同的brocker下
【RocketMQ】9.负载均衡,消息重试_第1张图片
图中箭头线条上的标号代表顺序,发布方会把第一条消息发送至Queue 0,然后第二条消息发送至Queue1,以此类推。

Consumer负载均衡

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

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

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

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

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

广播模式
由于广播莫i是下要求一条消息需要投递到一个消费组下面所有的消费者实例,所以也就没有消息被分摊消费的说法。在现实上,其中一个不同就是在consumer分配queue的时候,所有的consumer都分到所有的queue
【RocketMQ】9.负载均衡,消息重试_第4张图片

消息重试

顺序消息的重试

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

无序消息的重试

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

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

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

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

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

获取消息重试次数
消费者收到消息后,可按照如下方式获取消息的重试次数
【RocketMQ】9.负载均衡,消息重试_第9张图片

http://www.xdnf.cn/news/11404.html

相关文章:

  • Scrapy项目(东莞阳光网)---利用CrawlSpider爬取贴子内容,不含图片
  • Linux Vim最全面的教程——全网最详细
  • Cisco Packet Tracer安装指南
  • HTML实例网页代码 简单的个人博客网站设计与实现 (div+css)
  • 111111111111111111111111
  • Colours–颜色库,包含100种预定义的颜色和方法
  • 嵌入式开发中的硬件滤波器设计和软件滤波设计
  • C盘如何格式化?格式化C盘的方法介绍
  • 用友OA U8 test.jsp sql注入漏洞复现
  • ARM嵌入式系统设计(Cortex-M3))一课一得之STM32开发板
  • java实现操作PDFlib库实例(附完整源码)
  • 黑客工具软件大全100套(非常详细)从零基础入门到精通,看完这一篇就够了
  • java四舍五入
  • 什么是scrum里的3355
  • PHP中 stripslashes() 函数 和 addslashes() 函数
  • 2024计算机最吃香的几大专业,哪些好就业?
  • 对于过滤器中使用getInputStream()、getParameter()接收参数接收不到的一些知识,以及解决方法。
  • TLSF算法概念,原理,内存碎片问题分析
  • UML 类关系(详解)——依赖、关联、聚合、组合、泛化
  • “IT小百科”之“电脑开机密码忘记了怎么办”
  • mentohust 使用
  • 打造优质的灵修生活
  • ActiveSync同步使用方法
  • OGG|Oracle GoldenGate 基础知识介绍(二)
  • 介绍一个很不错的电影网站
  • css实现两端对齐的3种方法
  • 机动战士高达观影顺序
  • 光耦合器知识概述
  • HTTP 和 HTTPS 的区别(面试常考题),计算机专业学生必备
  • 堆栈溢出