RocketMQ部分消息消费不到的问题
在企业项目中,利用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部分消息消费不到的问题的更多相关文章
- 关于RocketMQ消息消费与重平衡的一些问题探讨
其实最好的学习方式就是互相交流,最近也有跟网友讨论了一些关于 RocketMQ 消息拉取与重平衡的问题,我姑且在这里写下我的一些总结. ## 关于 push 模式下的消息循环拉取问题 之前发表了一篇关 ...
- 【RocketMQ】消息的消费
上一讲[RocketMQ]消息的拉取 消息消费 当RocketMQ进行消息消费的时候,是通过ConsumeMessageConcurrentlyService的submitConsumeRequest ...
- rocketMq消息的发送和消息消费
rocketMq消息的发送和消息消费 一.消息推送 public void pushMessage() { String message = "推送消息内容!"; try { De ...
- RocketMQ的消息发送及消费
RocketMQ消息支持的模式: 消息支持的模式分为三种:NormalProducer(普通同步),消息异步发送,OneWay. 消息同步发送: 普通消息的发送和接收在前面已经演示过了,在前面的案例中 ...
- RocketMq如何顺序消费的消息offest
RocketMq对于消费者对于消息的如何处理的 1:如果设置了自动提交 返回: ConsumeOrderlyStatus.COMMIT, ConsumeOrderlyStatus.ROLLBACK, ...
- RocketMQ 消息消费
消息消费 难点:如何保证消息只消费一次? 消费模式: 1.单一消费模式:一条消息,仅被一个消费者进行消费. 如何进行负载?负载算法有 a.平均分配.b.平均轮询分配.c.一致性hash(不推荐).d. ...
- RocketMQ源码 — 九、 RocketMQ延时消息
上一节消息重试里面提到了重试的消息可以被延时消费,其实除此之外,用户发送的消息也可以指定延时时间(更准确的说是延时等级),然后在指定延时时间之后投递消息,然后被consumer消费.阿里云的ons还支 ...
- 聊一聊顺序消息(RocketMQ顺序消息的实现机制)
当我们说顺序时,我们在说什么? 日常思维中,顺序大部分情况会和时间关联起来,即时间的先后表示事件的顺序关系. 比如事件A发生在下午3点一刻,而事件B发生在下午4点,那么我们认为事件A发生在事件B之前, ...
- RocketMQ源码 — 十、 RocketMQ顺序消息
RocketMQ本身支持顺序消息,在使用上发送顺序消息和非顺序消息有所区别 发送顺序消息 SendResult sendResult = producer.send(msg, new MessageQ ...
随机推荐
- Pandas的基础操作(一)——矩阵表的创建及其属性
Pandas的基础操作(一)——矩阵表的创建及其属性 (注:记得在文件开头导入import numpy as np以及import pandas as pd) import pandas as pd ...
- Oracle 11g Java驱动包ojdbc6.jar安装到maven库,并查看jar具体版本号
ojdbc6.jar下载 Oracle官方宣布的Oracle数据库11g的驱动jar包是ojdbc6.jar ojdbc6.jar下载地址:https://www.oracle.com/technet ...
- Sql 脚本文件太大 还原数据库
sql脚本太大直接在数据库中执行会提示内存不足,我们看生成的脚本文件会发现每隔100条会有一个GO来分隔,这就好说了 在我将数据库的结构连同数据生成一个脚本文件db.sql 后,想在另外的电脑上恢复数 ...
- Java 常用API (第二部分)
常用api第二部分 Date 类 import java.util.Date; 时间原点: 1970-01-01 00:00:00(英国格林威治) 中国属于东八区, 会把时间增加 8 个小时: 197 ...
- mac 上使用 idea 上传项目代码到阿里云git上
1.Idea 打开需要上传的项目 2.先在本地创建一个git仓库 VCS --> Import into Version Control --> Create Git reposito ...
- session 在PC端正常设置读取,在移动端无法正常读取
一.背景 最近在做一个面向三端[H5.IOS.安卓]的短信验证码登录接口.发送短信验证码时,服务端通过 session 保存验证码的值.登录时,从 session 获取验证码和用户输入的验证码 相比较 ...
- springmvc集成cxf的方法
最近需要在项目中增加webservice接口,供三方调用,下面就把集成的方法展示如下,供大家参考: 第一步:服务端的发布; 1:配置web.xml文件,添加cxf的servlet <servle ...
- mysql8.x 新版本jdbc连接方式
旧版本,MySQL Connector/J 5.x 版本的连接方式:url = jdbc:mysql://localhost:3306/thrcloud_db01?useUnicode=true&am ...
- p1.BTC-密码学的原理
所谓加密货币是不加密的,区块链上所有的交易内容(包括:账户的地址,转账的地址)都是公开的. Bitcoin中主要用到密码学的中的两个功能:Hash和签名. 一 Hash Cryptographic h ...
- Android笔记(六十八) Fragment总结
Fragment的产生: 为了适应各种尺寸的屏幕,谷歌推出Fragment,可以把Fragment成Activity的一个组成部分,它拥有自己的生命周期.可以接收并处理用户的各种事件,还可以动态的增删 ...