如果消费者开始阅读某个主题,那么互联网连接在消费者完成阅读之前就中断了,会发生什么?关于这个主题的信息还保留着吗?Kafka是如何处理这种情况的?
dohp0rv51#
通常,队列使用者跟踪显式确认。也就是说,消费者说“谢谢,我已经处理了”,服务器说“不客气”。Kafka通过存储偏移量来处理这个问题。偏移量是消费者在流中的位置。例如,假设我有一个包含四个元素的流。
A, B, C, D
位置一是 A ,因此具有偏移量 0 将拉动 A . 一旦他们处理完 A ,则会将其偏移量更新为 1 . 通常的做法是将其存储在 __consumer_offsets 主题。当它们的偏移变为 1 ,他们得到下一个,也就是 B . 它们处理并增加它们的偏移量 __consumer_offsets 主题,2。以此类推。那么在中断中读期间会发生什么呢?大修期间需要考虑的事件有一个时间表:使用者根据其偏移量请求主题中的下一项。消费者开始阅读主题中的下一项。消费者阅读完主题中的项目。使用者处理主题中的项目。消费者更新其在 __consumer_offsets 主题。返回1。之前发生的任何错误,包括 4 将导致简单的重新请求和重新处理。这意味着如果您的消费者是有状态的,您将需要处理半处理的内容。之后发生的错误 4 已完成,但 5 未完成将不会导致重新处理。相反,它将重新建立连接,更新偏移量并处理下一项。
A
0
1
__consumer_offsets
B
4
5
1条答案
按热度按时间dohp0rv51#
通常,队列使用者跟踪显式确认。也就是说,消费者说“谢谢,我已经处理了”,服务器说“不客气”。
Kafka通过存储偏移量来处理这个问题。偏移量是消费者在流中的位置。例如,假设我有一个包含四个元素的流。
位置一是
A
,因此具有偏移量0
将拉动A
. 一旦他们处理完A
,则会将其偏移量更新为1
. 通常的做法是将其存储在__consumer_offsets
主题。当它们的偏移变为
1
,他们得到下一个,也就是B
. 它们处理并增加它们的偏移量__consumer_offsets
主题,2。以此类推。那么在中断中读期间会发生什么呢?
大修期间需要考虑的事件有一个时间表:
使用者根据其偏移量请求主题中的下一项。
消费者开始阅读主题中的下一项。
消费者阅读完主题中的项目。
使用者处理主题中的项目。
消费者更新其在
__consumer_offsets
主题。返回1。
之前发生的任何错误,包括
4
将导致简单的重新请求和重新处理。这意味着如果您的消费者是有状态的,您将需要处理半处理的内容。之后发生的错误
4
已完成,但5
未完成将不会导致重新处理。相反,它将重新建立连接,更新偏移量并处理下一项。