卡夫卡:在消费者完成从某个主题的阅读之前,如果连接中断,会发生什么情况?

时间:2019-02-15 17:30:14

标签: java apache-kafka

如果消费者开始阅读某个主题,然后在消费者完成阅读之前互联网连接断开,会发生什么?仍然保留有关该主题的消息吗?卡夫卡如何处理这种情况?

1 个答案:

答案 0 :(得分:4)

通常,队列使用者跟踪明确的确认。也就是说,消费者说“谢谢,我已经处理了”,服务器说“不客气”。

Kafka通过存储偏移量处理此问题。偏移量是使用者在流中的位置。例如,假设我有一个包含四个元素的流。

A, B, C, D

第一个位置的位置是A,因此,偏移量为0的消费者将拉动A。处理完A后,他们会将其偏移量更新为1。通常将其存储在__consumer_offsets主题的经纪人端。

当它们的偏移量变为1时,他们得到下一个,即B。他们在__consumer_offsets主题2中进行处理并增加其偏移量。依此类推。

那么在中断中读取期间会发生什么?

在此中断期间有一个事件时间表要考虑:

  1. 消费者根据其偏移量请求主题中的下一项。
  2. 消费者开始阅读主题中的下一项。
  3. 消费者完成阅读该主题中的项目。
  4. 消费者处理主题中的项目。
  5. 消费者在__consumer_offsets主题中更新其偏移量。
  6. 回到1。

之前(包括4发生的任何错误都将导致简单的重新请求和重新处理。这意味着如果您的消费者是有状态的,您将需要处理一半的事情。

4完成但5未完成之后发生的错误将导致重新处理。相反,它将重新建立连接,更新偏移量并处理下一项。