我不清楚为什么我们需要session.timeout.ms
和max.poll.interval.ms
以及我们何时会使用其中一个或另一个或两者?似乎两者都表明时间协调员的上限将等待消费者获得心跳,然后再将其假死。
此外,对于基于KIP-62的版本0.10.1.0+,它的表现如何?
答案 0 :(得分:66)
在KIP-62之前,只有session.timeout.ms
(即Kafka 0.10.0
及更早版本)。 max.poll.interval.ms
是通过KIP-62(Kafka 0.10.1
的一部分)引入的。{/ p>
KIP-62,通过后台心跳线程将心跳与poll()
的呼叫分离。这允许比心跳间隔更长的处理时间(即,两个连续poll()
之间的时间)。
假设处理消息需要1分钟。如果耦合了心跳和轮询(即,在KIP-62之前),则需要将session.timeout.ms
设置为大于1分钟以防止消费者超时。但是,如果消费者死亡,检测失败的消费者也需要超过1分钟。
KIP-62将轮询和心跳分离,允许在两次连续的民意测验中发送心跳。现在你有两个线程正在运行,心跳线程和处理线程因此,KIP-62为每个线程引入了一个超时。 session.timeout.ms
用于心跳线程,而max.poll.interval.ms
用于处理线程。
假设您设置了session.timeout.ms=30000
,因此,消费者心跳线程必须在此时间到期之前向代理发送心跳。另一方面,如果处理单个消息需要1分钟,则可以将max.poll.interval.ms
设置为大于一分钟,以便为处理线程提供更多时间来处理消息。
如果处理线程死亡,则需要max.poll.interval.ms
来检测。但是,如果整个消费者死亡(并且一个垂死的处理线程很可能崩溃包括心跳线程在内的整个消费者),则仅需session.timeout.ms
来检测它。
这个想法是,即使处理本身需要很长时间,也可以快速检测出失败的消费者。