同一个Topic,换了组名没有完全重新消费


https://github.com/alibaba/RocketMQ/issues/259

saaavsaaa commented  11 days ago

前天上线发现了一次这个情况,更换组名打算重新消费一次刚send的消息,但是并没有。。。

 
 
@gaoyf
gaoyf commented  10 days ago •  edited

如果你用的是DefaultMQPushConsumer,默认是ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET
那么,对于你说的重新换了组名,那就是说这个订阅关系是新的,在broker端没有记录.
那么起始消费的位置取决于这个broker上的topic对应的队列是否上线没多久且有没有堆积,
如果上线没多久且没有堆积,则从头消费,否则从队队尾开始消费

如果从队尾消费,有可能你发过的消息是消费不到的

 
@saaavsaaa
  
 
saaavsaaa commented  9 days ago

谢谢,但是用得是consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);,上线不久,没有堆积,当时没有消费完的消息只有31条,没有指定tag用的*

 
 
@gaoyf
gaoyf commented  8 days ago •  edited

上线久不久是指:你的consumequeue只有一个文件, 默认没改配置的话,一个文件能存30万条消息,也就是说你这个topic对应的queue的历史总消息量小于30万,那才算上线没多久

没有堆积是指:你的某个队列对应的commitlog中的全部消息量的实际大小,小于内存的40%,
也就是说它会假设你全部重新消费某个队列的所有消息,那么这些消息会全部经过内存,一旦消息量占用内存超过40%,则认为会发生堆积,跟你之前没有消费完的31条消息没关系,因为之前你用的group和新的group不是同一个,是两个无关的消费组。

另外,你指定的是CONSUME_FROM_FIRST_OFFSET, 那么要求从头消费,从头的话是指从现有队列的头,消息的保留时间默认不修改的话是只保留48小时的,之前的消息就删掉了

 
@saaavsaaa
  
 
saaavsaaa commented  7 days ago

谢谢,这两个概念明白了,不过其实这是rocket上线以后时间很近的第二次上线,消息3k都不到,内存就更没那么大了。。。,默认是48小时啊,那记错了,但是24小时都不到。。。

 
 
@saaavsaaa
  
 
saaavsaaa commented  a minute ago

因为再没遇到过,不过我猜测大概是因为producer和broker时间差距很大的原因造成消息过时,因为那次上线中同步了一下系统时间,系统时间变化较大


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM