如何从卡夫卡获得确认

时间:2013-07-31 07:09:40

标签: apache-kafka real-time-data

如果消费或处理消息,我如何准确地从Kafka获得确认。可能听起来很愚蠢,但有没有办法知道收到确认的消息的开始和结束偏移量?

2 个答案:

答案 0 :(得分:1)

到目前为止我发现的是0.8,他们引入了以下方法来选择偏移量进行阅读..

  

kafka.api.OffsetRequest.EarliestTime()在日志中查找数据的开头并从那里开始流式传输,kafka.api.OffsetRequest.LatestTime()将仅传输新消息。

示例代码 https://cwiki.apache.org/confluence/display/KAFKA/0.8.0+SimpleConsumer+Example

仍然不确定确认部分

答案 1 :(得分:1)

卡夫卡并没有真正的结构来做到这一点。要了解原因,请查看设计文档here

为了提供准确的确认,您需要为您的应用程序创建一些外部跟踪系统,您可以在其中显式写入确认并在事务ID上实现锁定,以确保只处理一次。实现诸如系统的计算成本非常高,并且是大型事务系统需要比较奇特的硬件并且比Kafka等系统具有更低可扩展性的主要原因之一。

如果您不需要强持久性语义,则可以使用groups API来粗略跟踪最后一条消息的读取时间。这可确保每条消息至少被读取一次。请注意,由于组API不能为您提供显式跟踪应用程序自己的处理逻辑的能力,因此在此方案中您的实际处理保证相当薄弱。依赖于幂等处理的方案在这种环境中很常见。

或者,您可以使用命名不佳的SimpleConsumer API(使用它非常复杂),这使您可以显式跟踪应用程序中的时间戳。这是通过本机Kafka API实现的最高级别的处理保证,因为它使您能够跟踪应用程序自己对从队列中读取的数据的处理。