问题描述
我们将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
中记录何时可用。