知道Kafka事件在K表中可见的最有效方法是什么?

问题描述

我们将Kafka主题既用作事件又用作存储库。使用kafka-streams API,我们定义了一个简单的K表,用于表示该主题中的所有事件。

在我们的用例中,我们将事件发布到该主题,然后将K-Table用作后备存储库。主要问题是发布的事件不会立即在K表上显示

我们尝试了事务处理,并且仅按这里所述(https://kafka.apache.org/26/documentation/streams/core-concepts#streams_processing_guarantee)处理了一次语义,但是总会有我们无法控制的延迟。

  • 发布事件
  • 不确定的时间
  • 已发布事件在K表中可见

是否有消除延迟的方法,或者是否知道K表已消耗了特定事件。

注意:我们尝试了分区表和全局表,结果相似。

谢谢

解决方法

由于Kafka是异步系统,因此预期会出现延迟,并且您无法采取任何措施来避免这种情况。

但是,如果您将消息发布到某个主题,则KafkaProducer允许您将Callback传递给send()方法,并且在编写消息后将执行回调主题,提供记录的元数据,例如主题,分区和偏移量。

Kafka Streams处理完消息后,它将最终提交偏移量(您也可以配置提交间隔)。因此,您可以知道在提交偏移量之后消息是否在KTable中。默认情况下,提交仅每30秒进行一次,并且不建议使用非常短的提交间隔,因为这意味着较大的开销。因此,我不确定这是否对您的情况有所帮助,因为您似乎希望更及时的“响应”。

或者,您也可以在KTable上禁用缓存,并使用toStream().process()步骤-在每次更新KTable之后,{{1}提供的变更日志流}将包含记录,您可以通过给定的toStream()对象访问Processor中的记录元数据(包括其偏移量)。因此,还应该让您找出ProcessorContext中记录何时可用。