• 首页 > 
  • 消息状态显示“Consumed”但消费端业务日志显示没有收到消息

消息状态显示“Consumed”但消费端业务日志显示没有收到消息

KB: 39141

 · 

更新时间:2021-03-02 09:40

问题描述

使用消息队列RocketMQ版后,消息状态显示“Consumed”,但是消费端业务日志显示没有收到消息。

问题原因

  • 原因一:业务代码在接收到消息后,不立即打印消息。收到消息后,如果直接进入业务逻辑,一旦代码遗漏某个逻辑分支,就会导致消息信息没有被留在业务日志中,造成没有收到消息的假象。
  • 原因二:消费端部署了多个消费实例。尤其是在调试阶段,消费端不可避免被多次重启,一旦多个消费进程同时存在(进程未退出),那么相当于进入集群的消费模式,多个消费实例会共同分担消费消息。以为没有收到的消息,其实是被另一个消费端接收。
  • 原因三:消息消费过程出现未被Catch的异常,导致消息被重新投递。
    public class MessageListenerImpl implements MessageListener {
        @Override
        public Action consume(Message message, ConsumeContext context) {
            //消息处理逻辑抛出异常,消息将重试。
            doConsumeMessage(message);
            //如果在doConsumeMessage()方法中出现未被Catch的异常,这行日志将不会打印。
            log.info("Receive Message, messageId:", message.getMsgID());
            return Action.CommitMessage;
        }
    }

解决方案

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。
  • 原因一的解决方案:建议您收到消息后,立即打印消息留存信息,例如MessageId、Timestamp和ReconsumeTimes等。
  • 原因二和原因三的解决方案:登录消息队列RocketMQ控制台,单击对应实例名称,选择Group 管理,单击对应Group ID,在客户端连接信息中会显示消费端的实例部署情况,例如有几个消费实例和对应的IP地址等信息,然后可以自行排查。

适用于

  • 消息队列RocketMQ版

如果您的问题仍未解决,您可以在阿里云社区免费咨询,或提交工单联系阿里云技术支持。