codelipenghui edited a comment on issue #3131: Consumer stop receive messages 
from broker
URL: https://github.com/apache/pulsar/issues/3131#issuecomment-453328896
 
 
   ### Broker dispatch process:
   1. Consumer subscribe to a topic, consumer will send a flow request.
   2. By default, broker will read 100 entries from ledger and distribute 
entries to 2 consumers, one consumer will get 20 entries 
first(MaxRoundRobinBatchSize = 20), in the test case, every entries has 2000 
messages by enable the batching message in producer.
   3. MaxUnackMessagesPerConsumer in broker settings is 100 and 
MaxUnackMessagesPerSubscription is 500.
   4. So when broker send messages to the first consumer, dispatcher will be 
blocked, because 20 entries has 40000 messages. I have two consumers with 
receive queue size 100, so the dispatcher init available permits is 200, after 
send 40000 messages to the first consumer, available permits is -39800.
   5. Consumer received messages and when call receive time > 50(receive queue 
size is 100), consumer will send permits request to the broker again, but now 
consumer is blocked by un-ack messages, so broker do not send any messages to 
consumer, and consumer will increase `permitsReceivedWhileConsumerBlocked`.
   6. While consumer send a redelivery request, dispatcher should release the 
flow control, but the logic in the consumer, consumer will use 
min(`permitsReceivedWhileConsumerBlocked`,`totalRedelivery`) to increase the 
available permits in the dispatcher. I think the problem is here, if 
totalRedelivery < permitsReceivedWhileConsumerBlocked, consumer is already send 
flow request, but broker can't release the flow control. When a consumer 
receive 10000 messages(5 message, batch size is 2000), consumer will send 200 
times flow request(50 messages per request),  if 
permitsReceivedWhileConsumerBlocked = 9000, at this time consumer redelivery 
2000 messages, dispatcher will use 2000 to increase the available permits. 
after consumer send the last 1000 messages flow request, dispatcher is until 
blocked.
   
   This is the test log:
   
   
[stop-consume-broker.log](https://github.com/apache/pulsar/files/2747607/stop-consume-broker.log)
   

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to