Java 延迟卡夫卡主题中的一些记录

Java 延迟卡夫卡主题中的一些记录,java,apache-kafka,kafka-consumer-api,Java,Apache Kafka,Kafka Consumer Api,我有一个消费者项目,它使用卡夫卡主题中的数据。该流中90%的数据可以实时处理,但对于特定记录(~10%),我需要延迟处理 我是否应该在同一JVM中有两个单独的使用者,在一个使用者中消耗90%的记录,而忽略这10%的记录,让另一个使用者处理它,或者将10%的消息推送到另一个主题,并延迟对另一个主题的处理 如果我可以有一个消费者和两个检查点机制,一个90%,另一个延迟10%,那就太好了,但是Kafka客户端似乎不支持这个用例。它将帮助我避免任何不必要的反序列化和网络IO。不可能为单个使用者设置多个检

我有一个消费者项目,它使用卡夫卡主题中的数据。该流中90%的数据可以实时处理,但对于特定记录(~10%),我需要延迟处理

我是否应该在同一JVM中有两个单独的使用者,在一个使用者中消耗90%的记录,而忽略这10%的记录,让另一个使用者处理它,或者将10%的消息推送到另一个主题,并延迟对另一个主题的处理


如果我可以有一个消费者和两个检查点机制,一个90%,另一个延迟10%,那就太好了,但是Kafka客户端似乎不支持这个用例。它将帮助我避免任何不必要的反序列化和网络IO。

不可能为单个使用者设置多个检查点-使用两个使用者或两个主题

  • 两个消费者的一个问题是,所有消息都会被读取两次,而不是在完全相同的时间,这就造成了一个问题:如果一个消费者在23:59:59和00:00:01读取今天生成的消息,而另一个消费者在00:00:01读取该消息,会发生什么情况(与相对时间相同的问题)。您可以使用一些滞后和监视器滞后来防止此问题

  • 将数据分为两个主题。您可以使用kafka stream或任何其他流处理工具进行此操作。例如,您的
    事件
    主题将被处理并分为两个主题
    历史事件
    实时事件
    。您仍然会有两个消费者,但主题不同。正如您所建议的,您也可以只使用
    事件
    主题,处理即时数据并将历史数据发送到另一个主题(因此您有两个主题而不是三个,提交的偏移量没有问题),但这意味着流程客户机需要更多IO,客户机需要承担两项责任

    由于只有一个消费者阅读基本主题中的每条消息,因此它将始终是最新的或历史的,因此您不会有上一期

  • 只有一个消费者会相应地处理消息,但正如您所指出的,偏移提交是有问题的,并且考虑到您的历史批次,可能会使用大量RAM。关于偏移提交,您可以简单地存储(在另一个卡夫卡压缩主题中,与_consumer_offset的方式相同)有关历史或当前偏移的最后一个偏移,重新启动时,从历史批次恢复,并忽略所有“最近”的数据,直到达到正确的偏移。这是可能的,但使用更多的RAM,而且方式更麻烦


您的选择在很大程度上取决于对您有问题的内容(IO、RAM,只是有一个正确的行为)。从一开始就将两个主题分开可能是最容易实现的,可以在单独的流程中完成,有效地分离每个流程的责任,并将对处理客户机的影响降至最低。

您所说的“特定记录”是什么意思?他们有什么特别的领域吗?此外,您所说的“延迟进程”是什么意思?正如您所说,如果它们不代表同一事件,最合理的做法是在另一个主题中生成这些数据并相应地使用它们。另一种方法是让消费者简单地读取数据并将其传输给某个工作者。然后您将有两个工人:一个用于实时,一个用于延迟消息。早读没有问题。我可能还没有清楚地了解你的需要,不要犹豫,给一些details@Treziac我们正在处理事件数据,并每分钟以微批量存储它们。如果事件时间戳来自前几天(~10%记录),我们需要延迟处理,并对历史数据进行更大的批处理。我认为使用同一个消费者并将其传输给另一个工作者可能不是一个好主意,因为数据需要在内存中保留15分钟以上(延迟),并且在此过程中我们无法提交检查点。此外,我无法控制数据的生成方式,因此我需要将消息推送到另一个主题,或者每个用例有两个消费者。感谢您的详细回复!我想我会采用单独主题的方法,但最后一个问题是:我们是否可以通过将数据以微批量方式推送到其他主题或使用简单的生产者并逐个分离记录来提高性能?这是最简单、最有效的方法?大多数kafka客户机(给定适当的配置)成批发送数据。也就是说,如果您要求客户端在500毫秒内生成100条消息,它将不会发送100条个人消息,而是发送一批100条消息(如果您将linger.ms设置为>500毫秒)。实际上,它将向每个必要的代理发送一条消息(如果您有三个代理,并且您将数据发送到一个主题,该主题的分区分布在这三个代理之间,那么您将发送3条消息),只有当数据从生产者有效发送时,您的消费者才应该提交偏移量。Kafka stream/apache flink/etc处理了所有这些本地银行,因为他们花时间回答了我的问题@特雷齐亚克