表象
01-17 16:57
重启了多个服务器,包括应用和MQ。- 重启步骤是先重启应用,后重启MQ主节点,再是MQ从节点重启
- 之后就是应用重新消费了
01-12
以来的所有消息
分析
思来想去,可能的原因有:
- offset没有更新到broker
- 重复投递?
- offset被应用修改了
前两点日志中没有相关的蛛丝马迹,而关于第三点则发现日志中有warn
:
[2021-01-17 17:02:58] WARN com.consumer.PriorityPullConsumer 243 lambda$startConsume$1 - msgqueue MessageQueue [topic=MT_MQ_L4, brokerName=broker-b, queueId=3] offset illegal,fix to 228871.
。。。offset被修改了。。。
相关的代码如下:
long offset = offsetManager.fetchConsumeOffset(consumer, mq);
PullResult pullResult = consumer.pull(mq, msgSelector, offset,maxPullFrameSize);
// 省略无关代码
if(pullResult.getPullStatus() == PullStatus.OFFSET_ILLEGAL){
consumer.updateConsumeOffset(mq, pullResult.getNextBeginOffset());
LOG.warn("msgqueue {} offset illegal,fix to {}.",mq,pullResult.getNextBeginOffset());
}
问题来了,为啥会PullStatus.OFFSET_ILLEGAL
???
排查
-
从
rocketmq_client.log
中发现:2021-01-17 00:00:07,573 createChannel: connect remote host[mq4:10911] timeout 3000ms 2021-01-17 00:00:10,574 createChannel: connect remote host[mq3:10911] timeout 3000ms
连接3s超时了。。。部署架构是双主双从,而
mq3
mq4
就是从节点。问一下技术支持,技术支持部署时没有开通应用连接从节点的网络策略。。。
又一个问题是,即使连不上从节点,那么只有主节点,就算主节点宕机,当主节点重启后,为啥会返回
PullStatus.OFFSET_ILLEGAL
? -
从
broker.log
日志中发现:2021-01-17 16:57:50 INFO PullMessageThread_21 - the request offset too small [requestOffset=0, brokerMinOffset=159611]
相关代码如下:
minOffset = consumeQueue.getMinOffsetInQueue(); maxOffset = consumeQueue.getMaxOffsetInQueue(); if (maxOffset == 0) { status = GetMessageStatus.NO_MESSAGE_IN_QUEUE; nextBeginOffset = nextOffsetCorrection