首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >RocketMQ消费者没有成功消费消息的问题排查

RocketMQ消费者没有成功消费消息的问题排查

作者头像
翎野君
发布于 2023-05-12 12:42:58
发布于 2023-05-12 12:42:58
5.2K00
代码可运行
举报
文章被收录于专栏:翎野君翎野君
运行总次数:0
代码可运行

背景

今天下游同事反馈,有一些以取消的订单库存还原异常了,导致部分商品库存没有还原。查日志发现没有收到还原消息,但是查看发送方是可以确认消息是已经发了的,那么是什么原因导致消费者没有收到,或者收到后没有处理消息呢。最后发现这些消息的状态都是NOT_ONLINE,原因是服务挂了,重启之后便可以重新消费了。让我们看看这个调查过程。

调查

消息丢失如何排查?当我们在使用mq的时候,经常会遇到消息消费异常的问题,原因有很多种,比如:

  • producer发送失败
  • consumer消费异常
  • consumer根本就没收到消息

「那么我们该如何排查了?」

其实借助RocketMQ-Dashboard就能高效的排查,里面有很多你想象不到的功能。

首先我们先查找期望消费的消息,查找的方式有很多种,根据消息id,时间等。

「消息没找到?」

说明proder发送异常,也有可能是消息过期了,因为rocketmq的消息默认保存72h,此时到producer端的日志进一步确认即可。

「消息找到了!」

接着看消息的消费状态,如下图消息的消费状态为NOT_ONLINE。

「NOT_ONLINE代表什么含义呢?」

别着急,我们一步步来分析,先看看TrackType到底有多少种状态。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public enum TrackType {
    CONSUMED,
    CONSUMED_BUT_FILTERED,
    PULL,
    NOT_CONSUME_YET,
    NOT_ONLINE,
    UNKNOWN
}

每种类型的解释如下:

类型

解释

CONSUMED

消息已经被消费

CONSUMED_BUT_FILTERED

消息已经投递但被过滤

PULL

消息消费的方式是拉模式

NOT_CONSUME_YET

目前没有被消费

NOT_ONLINE

CONSUMER不在线

UNKNOWN

未知错误

「怎么判定消息已经被消费?」

上一节我们讲到,broker会用一个map来保存每个queue的消费进度,「如果queue的offset大于被查询消息的offset则消息被消费,否则没有被消费」(NOT_CONSUME_YET)。

我们在RocketMQ-Dashboard上其实就能看到每个队列broker端的offset(代理者位点)以及消息消费的offset(消费者位点),差值就是没有被消费的消息。

当消息都被消费时,差值为0,如下图所示:

「CONSUMED_BUT_FILTERED表示消息已经投递,但是已经被过滤掉了」。例如producer发的是topicA,tagA,但是consumer订阅的却是topicA,tagB。

「CONSUMED_BUT_FILTERED(消息已经被投递但被过滤)是怎么发生的呢?」

这个就不得不提到RocketMQ中的一个概念,「消息消费要满足订阅关系一致性,即一个consumerGroup中的所有消费者订阅的topic和tag必须保持一致,不然就会造成消息丢失」。

如下图场景,发送了4条消息,consumer1订阅了topica-taga,而consumer2订阅了topica-tab。consumer1消费q0中的数据,consumer2消费q1中的数据。

投递到q0的msg-1和msg-3只有msg-1能被正常消费,而msg-3则是CONSUMED_BUT_FILTERED。因为msg-3被投递到q0,但是consumer1不消费tagb的消息导致消息被过滤,造成消息丢失。

同理msg-2这条消息也会丢失。

「注意,还有一个非常重要的点」!

虽然消息消费失败了,但是消息的offset还会正常提交,即 「消息消费失败了,但是状态也会是CONSUMED」。

「RocketMQ认为消息消费失败需要重试的场景有哪些?」

  • 返回ConsumeConcurrentlyStatus.RECONSUME_LATER
  • 返回null
  • 主动或被动抛出异常

「那么消费失败的消息去哪了呢?」

当消息消费失败,会被放到重试队列中,Topic名字为%RETRY% + consumerGroup。

「Consumer没订阅这个topic啊,怎么才能消费到重试消息?」

其实在Consumer启动的时候,框架内部帮你订阅了这个topic,所以重试消息能被消费到。

「另外消息不是一直重试,而是每隔1段时间进行重试」

第几次重试

与上次重试的间隔时间

第几次重试

与上次重试的间隔时间

1

10 秒

9

7 分钟

2

30 秒

10

8 分钟

3

1 分钟

11

9 分钟

4

2 分钟

12

10 分钟

5

3 分钟

13

20 分钟

6

4 分钟

14

30 分钟

7

5 分钟

15

1 小时

8

6 分钟

16

2 小时

当消息超过最大消费次数16次,会将消息投递到死信队列中,死信队列的topic名为%DLQ% + consumerGroup。

「因此当你发现消息状态为CONSUMED,但是消费失败时,去重试队列和死信队列中找就行了」。

首发链接:https://cloud.tencent.com/developer/article/2285763

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
RocketMQ消息丢失如何排查?
其实借助RocketMQ-Dashboard就能高效的排查,里面有很多你想象不到的功能
Java识堂
2022/04/06
2.6K0
RocketMQ消息丢失如何排查?
RocketMQ
同步发送消息是指,Producer发出⼀条消息后,会在收到MQ返回的ACK之后才发下⼀条消息。该方式的消息可靠性最高,但消息发送效率太低。
ruochen
2021/11/23
2.7K0
SpringBoot优雅整合RocketMQ
引入fastjson及rocketmq-client依赖,这两个都是必须的。版本号根据自己实际需求可更改
RRT冻羊
2022/11/03
1.7K0
横贯八方揭秘RabbitMQ、RocketMQ、Kafka 的核心原理(建议收藏)
今天我们通过一篇文章来认识一下常见消息队列RabbitMQ、RocketMQ、Kafka。
路人甲Java
2023/11/14
1.5K0
横贯八方揭秘RabbitMQ、RocketMQ、Kafka 的核心原理(建议收藏)
Rocketmq消费消息时不丢失不重复
在消费者端,需要确保在消息拉取并消费成功之后再给Broker返回ACK,就可以保证消息不丢失了,如果这个过程中Broker一直没收到ACK,那么就可以重试。所以,在消费者的代码中,一定要在业务逻辑的最后一步return ConsumeConcurrentlyStatus.CONSUME_SUCCESS
程序员子龙
2023/11/20
9820
MQ44# RocketMQ几个最近被问的问题
本周有点琐事,没有源码文章输出,掉一次链子。整理了几个最近被问的问题,大家随便看看。
瓜农老梁
2021/01/29
2.1K0
MQ44# RocketMQ几个最近被问的问题
RocketMQ详解(12)——RocketMQ的重试机制
由于MQ经常处于复杂的分布式系统中,考虑网络波动、服务宕机、程序异常因素,很有可能出现消息发送或者消费失败的问题。因此,消息的重试就是所有MQ中间件必须考虑到的一个关键点。如果没有消息重试,就可能产生消息丢失的问题,可能对系统产生很大的影响。所以,秉承宁可多发消息,也不可丢失消息的原则,大部分MQ都对消息重试提供了很好的支持。
张申傲
2020/09/03
6.9K0
消息中间件—RocketMQ消息消费(三)(消息消费重试)
摘要:如果Consumer端消费消息失败,那么RocketMQ是如何对失败的异常情况进行处理? 前面两篇RocketMQ消息消费(一)/(二)篇,主要从Push/Pull两种消费模式的简要流程、长轮询机制和Consumer端负载均衡这几点内容出发,介绍了RocketMQ消息消费的正常流程和细节内容,本篇内容将主要介绍Consumer端消费失败的异常流程。 这里先回顾往期RocketMQ技术分享的篇幅: (1)消息中间件—RocketMQ的RPC通信(一) (2)消息中间件—RocketMQ的RPC通信(二) (3)消息中间件—RocketMQ消息发送 (4)消息中间件—RocketMQ消息消费(一) (5)消息中间件—RocketMQ消息消费(二)(push模式实现)
用户2991389
2018/09/05
3.9K0
消息中间件—RocketMQ消息消费(三)(消息消费重试)
深入理解RocketMq普通消息和顺序消息使用,原理,优化
最近一直再做一些系统上的压测,并对一些问题做了优化,从这些里面收获了一些很多好的优化经验,后续的文章都会以这方面为主。
用户5397975
2019/11/28
3.5K0
深入理解RocketMq普通消息和顺序消息使用,原理,优化
RocketMQ入坑系列(二)近距离感受RocketMQ如何收发消息
RocketMQ官方GitHub上有一个项目rocketmq-externals,提供了很多扩展:
行百里er
2020/12/02
1K0
RocketMQ入坑系列(二)近距离感受RocketMQ如何收发消息
RocketMQ如何保证消息的可靠性投递?
producer向broker发送消息后,没有收到broker的ack时,rocketmq会自动重试。重试的次数可以设置,默认为2次
Java识堂
2021/05/06
3.3K1
RocketMQ事务消费和顺序消费详解
在网购的时候,我们需要下单,那么下单需要假如有三个顺序,第一、创建订单 ,第二:订单付款,第三:订单完成。也就是这个三个环节要有顺序,这个订单才有意义。RocketMQ可以保证顺序消费。
MonroeCode
2021/12/28
8610
RocketMQ事务消费和顺序消费详解
Rocketmq并发和顺序消费的失败重试机制
ConsumeMessageConcurrentlyService#processConsumeResult
石臻臻的杂货铺[同名公众号]
2025/05/24
1320
Rocketmq并发和顺序消费的失败重试机制
TDMQ RocketMQ 版订阅关系一致性原理与实践
腾讯云 TDMQ RocketMQ 版是基于 Apache RocketMQ 打造的满足金融级高可靠的在线业务消息队列产品,凭借其高可用、高可靠等特性,被广泛应用于金融、电商,社交等高并发场景,获得了各行各业用户的广泛认可。在实际使用中, 订阅关系不一致是开发者经常容易遇到的一个问题,可能会导致消息消费异常、消息丢失等现象。
腾讯云中间件团队
2025/04/30
1250
TDMQ RocketMQ 版订阅关系一致性原理与实践
RocketMQ系列 | 如何让消息“丢失”?
RocketMQ 5.0: 云原生“消息、事件、流”实时数据处理平台,覆盖云边端一体化数据处理场景。
烟雨平生
2023/10/01
5550
RocketMQ系列 | 如何让消息“丢失”?
3分钟白话RocketMQ系列—— 如何消费消息
前面已经介绍了 生产消息、存储消息 两大块内容,那接下来,我们白话一下RocketMQ是如何消费消息的,揭秘消息消费全过程。
阿丸笔记
2023/10/22
1.4K0
3分钟白话RocketMQ系列—— 如何消费消息
万字长文讲透 RocketMQ 的消费逻辑
RocketMQ 是笔者非常喜欢的消息队列,4.9.X 版本是目前使用最广泛的版本,但它的消费逻辑相对较重,很多同学学习起来没有头绪。
勇哥java实战
2023/09/04
1.5K0
万字长文讲透 RocketMQ 的消费逻辑
RocketMQ之消费者启动与消费流程
RocketMQ是由阿里巴巴开源的分布式消息中间件,支持顺序消息、定时消息、自定义过滤器、负载均衡、pull/push消息等功能。RocketMQ主要由 Producer、Broker、Consumer 、NameServer四部分组成,其中Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息。NameServer充当名字路由服务,整体架构图如下所示:
2020labs小助手
2022/07/12
1.2K0
SpringBoot集成RocketMq
同步发送是指消息发送方发出数据后,同步等待,直到收到接收方发回响应之后才发下一个请求。
程序员子龙
2023/11/26
5660
SpringBoot集成RocketMq
聊聊rocketmq的订阅关系
org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImpl.java
code4it
2023/05/08
4301
相关推荐
RocketMQ消息丢失如何排查?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验