接上文,今天继续。

9 消息重试

Consumer消费消息失败后,要提供一种重试机制,令消息再消费一次。Consumer消费消息失败通常可以认为有以下几种情况:

  • 由于消息本身的原因,例如反序列化失败,消息数据本身无法处理(例如话费充值,当前消息的手机号被注销,无法充值)等。这种错误通常需要跳过这条消息,再消费其它消息,而这条失败的消息即使立刻重试消费,99%也不成功,所以最好提供一种定时重试机制,即过10秒后再重试。
  • 由于依赖的下游应用服务不可用,例如db连接不可用,外系统网络不可达等。遇到这种错误,即使跳过当前失败的消息,消费其他消息同样也会报错。这种情况建议应用sleep 30s,再消费下一条消息,这样可以减轻Broker重试消息的压力。

RocketMQ会为每个消费组都设置一个Topic名称为“%RETRY%+consumerGroup”的重试队列(这里需要注意的是,这个Topic的重试队列是针对消费组,而不是针对每个Topic设置的),用于暂时保存因为各种异常而导致Consumer端无法消费的消息。考虑到异常恢复起来需要一些时间,会为重试队列设置多个重试级别,每个重试级别都有与之对应的重新投递延时,重试次数越多投递延时就越大。RocketMQ对于重试消息的处理是先保存至Topic名称为“SCHEDULE_TOPIC_XXXX”的延迟队列中,后台定时任务按照对应的时间进行Delay后重新保存至“%RETRY%+consumerGroup”的重试队列中。

10 消息重投

生产者在发送消息时,同步消息失败会重投,异步消息有重试,oneway没有任何保证。消息重投保证消息尽可能发送成功、不丢失,但可能会造成消息重复,消息重复在RocketMQ中是无法避免的问题。消息重复在一般情况下不会发生,当出现消息量大、网络抖动,消息重复就会是大概率事件。另外,生产者主动重发、consumer负载变化也会导致重复消息。如下方法可以设置消息重试策略:

  • retryTimesWhenSendFailed:同步发送失败重投次数,默认为2,因此生产者会最多尝试发送retryTimesWhenSendFailed + 1次。不会选择上次失败的broker,尝试向其他broker发送,最大程度保证消息不丢。超过重投次数,抛出异常,由客户端保证消息不丢。当出现RemotingException、MQClientException和部分MQBrokerException时会重投。
  • retryTimesWhenSendAsyncFailed:异步发送失败重试次数,异步重试不会选择其他broker,仅在同一个broker上做重试,不保证消息不丢。
  • retryAnotherBrokerWhenNotStoreOK:消息刷盘(主或备)超时或slave不可用(返回状态非SEND_OK),是否尝试发送到其他broker,默认false。十分重要消息可以开启。

11 流量控制

生产者流控,因为broker处理能力达到瓶颈;消费者流控,因为消费能力达到瓶颈。

生产者流控:

  • commitLog文件被锁时间超过osPageCacheBusyTimeOutMills时,参数默认为1000ms,返回流控。
  • 如果开启transientStorePoolEnable == true,且broker为异步刷盘的主机,且transientStorePool中资源不足,拒绝当前send请求,返回流控。
  • broker每隔10ms检查send请求队列头部请求的等待时间,如果超过waitTimeMillsInSendQueue,默认200ms,拒绝当前send请求,返回流控。
  • broker通过拒绝send 请求方式实现流量控制。

注意,生产者流控,不会尝试消息重投。

消费者流控:

  • 消费者本地缓存消息数超过pullThresholdForQueue时,默认1000。
  • 消费者本地缓存消息大小超过pullThresholdSizeForQueue时,默认100MB。
  • 消费者本地缓存消息跨度超过consumeConcurrentlyMaxSpan时,默认2000。

消费者流控的结果是降低拉取频率。

12 死信队列

死信队列用于处理无法被正常消费的消息。当一条消息初次消费失败,消息队列会自动进行消息重试;达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息,此时,消息队列 不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中。

RocketMQ将这种正常情况下无法被消费的消息称为死信消息(Dead-Letter Message),将存储死信消息的特殊队列称为死信队列(Dead-Letter Queue)。在RocketMQ中,可以通过使用console控制台对死信队列中的消息进行重发来使得消费者实例再次进行消费。

rocketmq 重复消费_RocketMQ的十二个特性,你都知道吗「下」相关推荐

  1. 十二生肖被戏称为“十二缺”,指的是这十二种动物各自都缺少一样东西

    十二生肖被戏称为"十二缺",指的是这十二种动物各自都缺少一样东西 那么这些生肖动物都各自缺少什么呢?你知道你的属相缺少的是什么东西吗?下面就一起来看看吧! [鼠无脑] 所谓兽无完兽 ...

  2. rocketmq 重复消费_消息队列 RocketMQ

    引言 本文整理了RocketMQ的相关知识,方便以后查阅. 功能介绍 简单来说,消息队列就是基础数据结构课程里"先进先出"的一种数据结构,但是如果要消除单点故障,保证消息传输的可靠 ...

  3. RocketMQ消息消费源码分析(二消息的消费)

    首先回到DefaultMQPushConsumerImpl  start方法 public synchronized void start() throws MQClientException {sw ...

  4. rocketmq 顺序消费_RocketMQ核心概念扫盲

    在正式进入RocketMQ的学习之前,我觉得有必要梳理一下RocketMQ核心概念,为大家学习RocketMQ打下牢固的基础. 1.RocketMQ部署架构 在RocketMQ主要的组件如下: Nam ...

  5. 面渣逆袭:Redis连环五十二问,图文详解,这下面试稳了

    大家好,我是老三,面渣逆袭系列继续,这节我们来搞定Redis--不会有人假期玩去了吧?不会吧? 基础 1.说说什么是Redis? Redis是一种基于键值对(key-value)的NoSQL数据库. ...

  6. 第九十二期:多少程序员注意到了「中台」的背面?

    中台这个词,最近两年特别火,它的爆发源于2015年张勇在阿里发出的内部信中提到的"大中台,小前台"战略.随后吸引了很多人开始"追逐"它.也有很多人开始借着这概念 ...

  7. 区块链技术基础语言(三十二):Go语言网络编程(下)

    本文紧接上文所述,讲解socket编程和HTTP编程. 一.socket编程 在上一节我们介绍了网络体系的五层模型,介绍了每层模型所遵守的协议.TCP/IP是一个协议族,它由网络层的IP协议和传输层的 ...

  8. tensorflow精进之路(二十二)——使用slim模型对图像识别与检测(下)(VGG19模型)

    1.概述 上一节使用slim对图像进行识别,但是一张图片里就识别出一样东西,这节我们就来学习怎么检测图片里更多的物品.上一节我们使用的是Inception-ResNet-v2模型,这一节我们使用的是V ...

  9. WCF 4.0 进阶系列 – 第十二章 实现单向操作和异步操作(下)

    使用消息队列 消息队列是本书WCF异步技术中的最后一个出场的.消息队列可以为消息传输提供持久性.可靠性和事务性.甚至,发送消息的客户端程序与接受消息的服务可以不必同时运行.但使用该灵活性需要付出一定的 ...

最新文章

  1. RESTful到底是什么玩意??
  2. MFC CString转换为字符数组
  3. cmd中net start mysql发生系统错误5
  4. Bit-Z为什么成为熊市之光?
  5. python测试需要学什么_从手工测试到自动化测试需要学什么?
  6. iOS开发之share第三方登录以及分享
  7. 【Ids4实战】最全的 v4 版本升级指南
  8. java面试题28 牛客 下面有关java classloader说法错误的是?
  9. android自动化测试之robotium初探(三),Android自动化测试之Robotium--基础操作.pdf
  10. java 基本类型 包装类型_Java中基本类型和包装类
  11. 32位算术逻辑运算单元alu设计_依据基本原理构建现代计算机(二)—— ALU
  12. CVE-2020-16875: Microsoft Exchange远程代码执行漏洞通告
  13. sql视图 权限_SQLmysql用户权限管理
  14. ProjectEuler 009题
  15. AES-encryptor
  16. DoEvents应用
  17. 常用数学建模知识点及方法总结(1)(2021-8-10)
  18. 电子签章系统解决方案
  19. DirectX12(D3D12)基础教程(十八)—— PBR基础从物理到艺术(下)
  20. unity 粒子系统面板参数释义

热门文章

  1. R使用neuralnet包构建神经网络回归模型并与线性回归模型对比实战
  2. 什么是结构风险?在决策树类相关算法中通常有哪些正则化参数来控制模型的结构风险?解读一下
  3. 梯度下降回归SGDRegressor、岭回归(Ridge)和套索(Lasso)回归、套索最小角回归、ElasticNet回归、正交匹配追踪回归
  4. 巴菲特+查理芒格+投资理论+经典语录+给韭菜的启示
  5. matplotlib画图、如何提高图像分辨率?
  6. R语言包_plotly
  7. Bi-level error correction for PacBio long reads. PacBio长读数的两级纠错
  8. DNA sequencing technologies: 2006–2016
  9. linux pwm控制蜂鸣器 滴滴_兴安盟KOBISHI电磁蜂鸣器BZ-21BLAC24V保证
  10. Caffe在Ubuntu 14.04 64bit 下的安装------pycaffe 配置