在企业项目中,利用RocketMQ接收数据,存库。

由于是第一次在项目中具体的使用RocketMQ,一直采坑。

1、发现问题:在最终的联调过程中,并发压测,订单数据丢失,同一时刻,oms推送900+的数据,结果消费者只获取并入库了20几条,绝大部分消息丢失。

自己手写了一个生产者测试类,用最原始的循环的方式快速存入多条数据(此处为了测试方便,并不是重复消费问题,实际项目中消费端要加幂等去重)。一次就存5条但是每次都丢两条,好像最后两条数据永远消费不到的样子。

但在,RocketMQ在控制台上明显可以看到这五条数据都已经发送到topic下

2、原因排查及解决:
        (1)我在程序中原本就有在关键地方打印日志,通过阅读日志信息,我发现,在MessageListenerConcurrently()这个类中的consumeMessage方法中,前后两条消息几乎同时打印接收日志。为防止发生线程安全问题,及日志的可读性(其实只解决了日志可读性),及接收到一条消息的日志一连串的打印出来,中间不要穿插别的消息的日志,对整个方法加上锁sychronized。

到这里,该问题还是没有解决。

(2)怀疑是由于消费者ConsumeFromWhere配置的问题,我刚开始配置的是CONSUME_FROM_FIRST_OFFSET:第一次启动从队列初始位置消费,后续再启动接着上次消费的进度开始消费。然后我重新启动消费者,竟然神奇的好使了。
          问题似乎从这里解决了
  (3) 第二天,问题又出现了,说明之前的改了半天还是没找到问题的源头,之前我一直用wifi连接,结果我进了消费者组里面 看了,发现了消费者组内有其他的消费者占中了我一个队列,问题就是出现在这里。

如图,当我的本地没有启动消费者时,这个客户端会占用所有的队列。当我起来的时候,我就占用了前两个队列,而该客户端还会占用一个队列。这就是问题所在了,我们在同一个消费者组下,它占用了一个队列,势必会消费掉那个队列的数据,导致我消费的只是部分数据。

2、总结:

  同一个消费者组的消费者,会分别占用不同的队列,均衡瓜分消费该topic下的消息。

RocketMQ部分消息消费不到的问题的更多相关文章

  1. 关于RocketMQ消息消费与重平衡的一些问题探讨

    其实最好的学习方式就是互相交流,最近也有跟网友讨论了一些关于 RocketMQ 消息拉取与重平衡的问题,我姑且在这里写下我的一些总结. ## 关于 push 模式下的消息循环拉取问题 之前发表了一篇关 ...

  2. 【RocketMQ】消息的消费

    上一讲[RocketMQ]消息的拉取 消息消费 当RocketMQ进行消息消费的时候,是通过ConsumeMessageConcurrentlyService的submitConsumeRequest ...

  3. rocketMq消息的发送和消息消费

    rocketMq消息的发送和消息消费 一.消息推送 public void pushMessage() { String message = "推送消息内容!"; try { De ...

  4. RocketMQ的消息发送及消费

    RocketMQ消息支持的模式: 消息支持的模式分为三种:NormalProducer(普通同步),消息异步发送,OneWay. 消息同步发送: 普通消息的发送和接收在前面已经演示过了,在前面的案例中 ...

  5. RocketMq如何顺序消费的消息offest

    RocketMq对于消费者对于消息的如何处理的 1:如果设置了自动提交 返回: ConsumeOrderlyStatus.COMMIT, ConsumeOrderlyStatus.ROLLBACK, ...

  6. RocketMQ 消息消费

    消息消费 难点:如何保证消息只消费一次? 消费模式: 1.单一消费模式:一条消息,仅被一个消费者进行消费. 如何进行负载?负载算法有 a.平均分配.b.平均轮询分配.c.一致性hash(不推荐).d. ...

  7. RocketMQ源码 — 九、 RocketMQ延时消息

    上一节消息重试里面提到了重试的消息可以被延时消费,其实除此之外,用户发送的消息也可以指定延时时间(更准确的说是延时等级),然后在指定延时时间之后投递消息,然后被consumer消费.阿里云的ons还支 ...

  8. 聊一聊顺序消息(RocketMQ顺序消息的实现机制)

    当我们说顺序时,我们在说什么? 日常思维中,顺序大部分情况会和时间关联起来,即时间的先后表示事件的顺序关系. 比如事件A发生在下午3点一刻,而事件B发生在下午4点,那么我们认为事件A发生在事件B之前, ...

  9. RocketMQ源码 — 十、 RocketMQ顺序消息

    RocketMQ本身支持顺序消息,在使用上发送顺序消息和非顺序消息有所区别 发送顺序消息 SendResult sendResult = producer.send(msg, new MessageQ ...

随机推荐

  1. centos发布 7.7.1908版本了,怎么把老版本更新到新版本了?

    CENTOS升级 7.6 升级到7.7.1908 0.查看目前版本 cat /etc/issue cat /etc/redhat-release 1.下载系统镜像文件 https://www.cent ...

  2. Django 报错 admin.E408 admin.E409 admin.E410

    报错内容 ERRORS: ?: (admin.E408) 'django.contrib.auth.middleware.AuthenticationMiddleware' must be in MI ...

  3. resnet的理解-- 面试笔记

    上周参加了XX大学研究生推免的面试,面试老爷问到了resnet主要解决了什么问题,我下意识的回答到解决了当网络加深的时候会出现的vanishing/exploding gradients,然后面试老爷 ...

  4. zookerper入门、核心概念和使用场景

    zookeeper是一个分布式程序的高性能协调服务,提供集中式信息存储服务,数据存储于内存中,类似文件系统的树形结构,高吞吐量和低延时,集群高可靠,基于zookeeper可以实现分布式统一配置中心.分 ...

  5. kubernetes第八章--NFS PersistentVolume

  6. windows cmd下列出当前目录下的所有文件

    使用的命令是dir 如,列出当前目录下的目录及文件名到1.txt: dir /b >1.txt 只列出某类文件 dir *.txt  /b >1.txt

  7. iOS - WebRTC 自编译(音视频即时通讯开源库)

    什么是WebRTC? WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,简而言之它是一个支持网页浏览器进行实时语音对话或视频对话的技术.是谷歌2010 ...

  8. python3基础之“小练习(1)”

    (一)打印3个不同的字符 # a=int("123") # b="123" # c=1.2 # print(type(a),a) # print(type(b) ...

  9. js编写日历的思路

    首先写出一个日历我们需要考虑以下2个问题: 每个月的总天数 每个月的第一天周几 这里提供了一个判断平年闰年2月份天数的方法: function leapYear(year) { return (yea ...

  10. 微信web开发问题记录

    问题一.微信浏览器中无法使用reload重载文档[VUE框架] 问题分析: 微信不支持location.reload()方法,在微信浏览器中会失效 Vue中的路由跳转是类似于ajax局部刷新,因此使用 ...