【问题标题】:Delaying some records in a Kafka topic延迟 Kafka 主题中的一些记录
【发布时间】:2017-12-29 20:59:25
【问题描述】:

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

我是否应该在同一个 JVM 中有两个独立的消费者并在一个消费者中消费 90% 的记录并忽略 10% 并让其他消费者处理它或将 10% 的消息推送到另一个主题并延迟处理其他话题?

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

【问题讨论】:

  • “特定记录”是什么意思?他们有什么特殊的领域?另外,“延迟过程”是什么意思?正如您所说,如果它们不代表相同的事件,最合乎逻辑的做法是在另一个主题中生成这些数据并相应地使用它。另一种方法是让消费者简单地读取数据并将它们传输给某个工作人员。然后你会有两个工人:一个是实时的,一个是延迟消息的。早点阅读它们没有问题。我可能没有清楚了解您的需求,请不要犹豫,提供一些详细信息
  • @Treziac 我们正在处理事件数据并每分钟将它们以微批次的形式存储。如果事件时间戳来自前几天(约 10% 的记录),我们需要延迟处理并为历史数据提供更大的批次。我认为使用同一个消费者并将它们转移给另一个工作人员可能不是一个好主意,因为数据需要在内存中超过 15 分钟(延迟),我们不能在这个过程中提交检查点。此外,我无法控制数据的生成方式,因此我要么需要将消息推送到另一个主题,要么为每个用例设置两个消费者。

标签: java apache-kafka kafka-consumer-api


【解决方案1】:

单个消费者不可能有多个检查点 - 使用两个消费者或两个主题。

  • 两个消费者的一个问题是所有消息将被读取两次,而不是在完全相同的时间,这提出了知道消息何时是历史消息以及何时不是历史消息的问题:如果今天处理的消息是一位消费者在 23:59:59 阅读,另一位消费者在 00:00:01 阅读(与相对时间相同的问题)。您可以使用一些滞后和监控滞后来防止此问题。

  • 将您的数据分成两个主题。您可以为此使用 kafka 流或任何其他流处理工具。例如,您的events 主题将被处理并分为两个主题historical-eventsrealtime-events。你仍然会有两个消费者,但不是在同一个主题上。正如您所提议的,您也可以只使用您的 events 主题,处理即时数据并将历史数据发送到另一个主题(因此您有两个主题而不是三个,并且提交的偏移量没有问题) - 但这意味着更多的 IO流程客户端,以及客户端的两个职责

    由于您只有一个消费者阅读来自基本主题的每条消息,因此它将始终是最近的或历史的,因此您不会遇到上一个问题。

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

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

【讨论】:

  • 感谢您的详细回复!我想我会采用单独的主题方法,但最后一个问题是:我们可以通过将数据以微批量方式推送到其他主题或使用简单的生产者并将记录一一解耦来提高性能吗?最有效的方法?
  • 大多数 kafka 客户端(在适当的配置下)分批发送数据。即,如果您要求客户端在 500 毫秒内生成 100 条消息,它不会发送 100 条个人消息,而是发送一批 100 条消息(如果您设置 linger.ms > 500 毫秒)。好吧,实际上,它将向每个必要的代理发送一条消息(如果您有三个代理,并且您将数据发送到其分区分布在这三个代理之间的主题,您将发送 3 条消息)您的消费者应该只提交一次偏移量数据实际上是从生产者发送的。 Kafka stream / apache flink / etc 原生处理所有这些
  • 感谢您花时间回答我的问题。 @特雷齐亚克
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 2019-03-14
  • 1970-01-01
  • 2020-01-20
  • 2020-09-15
  • 2023-03-19
相关资源
最近更新 更多