一旦消息被消费或处理,我如何准确地从 Kafka 获得确认。听起来可能很愚蠢,但是有没有办法知道已收到 ack 的消息的开始和结束偏移量?
2 回答
卡夫卡并没有真正做到这一点。要了解原因,请查看此处的设计文档。
为了提供一次性确认,您需要为您的应用程序创建一些外部跟踪系统,在其中显式编写确认并在事务 id 上实施锁定,以确保事情只处理一次。实施此类系统的计算成本非常高,这也是大型事务系统需要相对奇特的硬件并且可扩展性低于 Kafka 等系统的主要原因之一。
如果您不需要强大的持久性语义,您可以使用组 API 来粗略跟踪读取最后一条消息的时间。这可确保每条消息至少被读取一次。请注意,由于组 API 不为您提供显式跟踪应用程序自己的处理逻辑的能力,因此在这种情况下,您的实际处理保证相当薄弱。依赖幂等处理的方案在这种环境中很常见。
或者,您可以使用名称不佳的 SimpleConsumer API(使用起来非常复杂),它使您能够显式跟踪应用程序中的时间戳。这是可以通过本机 Kafka API 实现的最高级别的处理保证,因为它使您能够跟踪应用程序自己对从队列中读取的数据的处理。
到目前为止,我发现在 0.8 中,他们引入了以下方法来从偏移量中进行选择以进行读取..
kafka.api.OffsetRequest.EarliestTime() 在日志中找到数据的开头并从那里开始流式传输, kafka.api.OffsetRequest.LatestTime() 只会流式传输新消息。
示例代码 https://cwiki.apache.org/confluence/display/KAFKA/0.8.0+SimpleConsumer+Example
仍然不确定确认部分