lwclover opened a new pull request #3120:
URL: https://github.com/apache/rocketmq/pull/3120


   ## What do I find?
      In production practice,There is a situation that is starting many diffent 
consumers and using web controls consumers restarting and stoping at the same 
time in one running process.
      then I noticed a problem one day after stoping and starting consumers 
using web,There was a consumer who reconsume messages a few days ago.
   
   ## What is the purpose of the change?
   fix issue below: 
   producing a ghost consumer at frequently start and stop consumers in the 
same process,who can not consume message,but can pull messages and submit the 
same consume offset.
   
   ## Clues below
   find offset reset in **host1** rocketmq_client.log:
   ```
   2021-06-08 14:19:23,023 INFO RocketmqClient - [persistAll] Group: 
topic-xxx-consumer ClientId: host1@29158 updateConsumeOffsetToBroker 
MessageQueue [topic=topic-xxx brokerName=broker-a, queueId=5] 2678704
   2021-06-08 14:19:23,023 INFO RocketmqClient - the consumer 
[topic-xxx-consumer] shutdown OK
   2021-06-08 14:19:24,024 INFO RocketmqClient - the consumer 
[topic-xxx-consumer] start beginning. messageModel=CLUSTERING, isUnitMode=false
   2021-06-08 14:19:24,024 INFO RocketmqClient - the consumer 
[topic-xxx-consumer] start OK.
   2021-06-08 14:19:24,024 INFO RocketmqClient - doRebalance, 
topic-xxx-consumer, add a new pull request PullRequest 
[consumerGroup=topic-xxx-consumer, messageQueue=MessageQueue [topic=topic-xxx 
brokerName=broker-a, queueId=5], nextOffset=2611518]
   ```
   find ghost consumer submit consume offset from **host2**:
   ```
   2021-06-04 00:00:00 WARN PullMessageThread_55 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2613665
   2021-06-04 00:00:00 WARN PullMessageThread_87 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2613666
   2021-06-04 00:00:00 WARN PullMessageThread_107 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2613667
   2021-06-04 00:00:01 WARN PullMessageThread_71 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2613668
   2021-06-04 00:00:01 WARN PullMessageThread_17 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2613669
   2021-06-04 00:00:01 WARN PullMessageThread_13 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2613670
   2021-06-04 00:00:02 WARN PullMessageThread_93 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2613671
   2021-06-04 00:00:02 WARN PullMessageThread_121 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2613672
   
..........................................................................................................................................................................................................................
   2021-06-07 18:49:45 WARN PullMessageThread_18 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2670228
   2021-06-07 18:49:46 WARN PullMessageThread_79 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2670229
   2021-06-07 18:49:47 WARN PullMessageThread_61 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2670230
   2021-06-07 18:49:50 WARN PullMessageThread_43 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2670231
   2021-06-07 18:49:51 WARN PullMessageThread_14 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2670232
   2021-06-07 18:49:52 WARN PullMessageThread_67 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2670233
   2021-06-07 18:49:56 WARN PullMessageThread_67 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2670234
   
..........................................................................................................................................................................................................................
   2021-06-08 14:20:00 WARN PullMessageThread_123 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2636343
   2021-06-08 14:20:00 WARN PullMessageThread_29 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2636385
   2021-06-08 14:20:00 WARN PullMessageThread_90 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2636621
   2021-06-08 14:20:03 WARN PullMessageThread_60 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2637975
   2021-06-08 14:20:03 WARN PullMessageThread_114 - [NOTIFYME]update consumer 
offset less than store. clientHost=host2:35394, 
key=topic-xxx@topic-xxx-consumer, queueId=5, requestOffset=2611518, 
storeOffset=2638184
   ```
   
   finally **host2** triggers flow control:
   ```
   2021-06-03 23:47:18,018 WARN RocketmqClient - the queue's messages, span too 
long, so do flow control, minOffset=2611615, maxOffset=2613616, maxSpan=2001, 
pullRequest=PullRequest [consumerGroup=topic-xxx-consumer, 
messageQueue=MessageQueue [topic=topic-xxx, brokerName=broker-a, queueId=15], 
nextOffset=2613617], flowControlTimes=1
   2021-06-04 00:16:42,042 WARN RocketmqClient - the queue's messages, span too 
long, so do flow control, minOffset=2611518, maxOffset=2613736, maxSpan=2218, 
pullRequest=PullRequest [consumerGroup=topic-xxx-consumer, 
messageQueue=MessageQueue [topic=topic-xxx, brokerName=broker-a, queueId=5], 
nextOffset=2613737], flowControlTimes=7001
   2021-06-05 11:11:12,012 WARN RocketmqClient - the queue's messages, span too 
long, so do flow control, minOffset=2611518, maxOffset=2632183, maxSpan=20665, 
pullRequest=PullRequest [consumerGroup=topic-xxx-consumer, 
messageQueue=MessageQueue [topic=topic-xxx, brokerName=broker-a, queueId=5], 
nextOffset=2632184], flowControlTimes=534001
   
..........................................................................................................................................................................................................................................
   2021-06-08 19:33:51,051 WARN RocketmqClient - the queue's messages, span too 
long, so do flow control, minOffset=2611518, maxOffset=2678767, maxSpan=67249, 
pullRequest=PullRequest [consumerGroup=topic-xxx-consumer, 
messageQueue=MessageQueue [topic=topic-xxx, brokerName=broker-a, queueId=5], 
nextOffset=2678768], flowControlTimes=1131001
   ```
   
   **We can find host1 consuming broker-a queueId=5, but at the same time host2 
is submit the same offset 2611518.
   producing a ghost consumer at frequently start and stop consumers in the 
same process,who can not consume message,but can pull messages and submit the 
same consume offset.**
   ## root cause
   **The root cause is that class MQClientInstance`s registerConsumer and 
unregisterConsumer is not atomic operation.**


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to