在企业项目中,利用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. 【LEETCODE】59、数组分类,适中级别,题目:39、48、64

    package y2019.Algorithm.array.medium; import java.util.*; /** * @ProjectName: cutter-point * @Packag ...

  2. 【LEETCODE】52、数组分类,简单级别,题目:717,661,746,628,643,849

    package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...

  3. fastjson转换对象时出错,"$ref": "$.data.list[0].xxxx"

    出现$ref: "$.list[2]"的原因是因为循环引用/内存对象重复. $ref”:”..” 上一级“$ref”:”@” 当前对象,也就是自引用“$ref”:”$” 根对象{& ...

  4. iview 表格随着更改刷新

    使用location.reload() 或者是 路由的 this.$router.go(0) 进行刷新的时候,是会出现一阵的空白区域的,因为是整个页面的刷新 ,所以比较缓慢,因此使用了provide/ ...

  5. quartz2.3.0(十五)执行、暂停、继续执行、清除,花式操作数据库中持久化的job任务

    #################################################################################################### ...

  6. condition的使用

    condition 的作用:条件锁 需求: 按需执行三个线程. 用wait,notify的方式: /** * 有序线程 wait,notify版 */ public class OrderThread ...

  7. ubuntu 16.04 英伟达驱动安装

    参考:https://blog.csdn.net/breeze5428/article/details/80013753 换了一个新的地方,得重新配置Ubuntu 16.04,在配置NVIDIA驱动的 ...

  8. ByteBuf源码

    ByteBuf是顶层的抽象类,定义了用于传输数据的ByteBuf需要的方法和属性. AbstractByteBuf 直接继承ByteBuf,一些公共属性和方法的公共逻辑会在这里定义.例如虽然不同性质的 ...

  9. IdentityServer4实现OAuth2.0四种模式之授权码模式

    接上一篇:IdentityServer4实现OAuth2.0四种模式之隐藏模式 授权码模式隐藏码模式最大不同是授权码模式不直接返回token,而是先返回一个授权码,然后再根据这个授权码去请求token ...

  10. 【转载】 C#使用Math.PI常量来表示圆周率

    在C#中计算圆形面积的时候,我们时常会用到圆周率这个变量,圆周率我们一般定义为十进制decimal类型变量,圆周率的值为3.1415926535等一个近似值,其实在C#的数值计算类Math类中,有专门 ...