实时处理中始终仅处理最新消息(每个键)

问题描述 投票:0回答:2

在消费Kafka主题时,Kafka会将所有消息按顺序传递给消费者。现在假设主题中的数据是实时数据,其中只有每个键的最新消息很重要,即同一键的所有先前消息都可以被认为是过时的(例如股票价格)。

有时,当处理速度慢于生产速度时,是否有一种优雅的方法来忽略密钥的所有先前消息并仅处理最新消息?

在下面的序列图中,位于

2. consume
,其中有 2 条 key1 消息正在等待。

我强烈的预感是,这是不可能的(优雅地),因为消息的处理发生在分区级别。如果是这样,如果我保证 1:1 映射 key:partition 是否可能,例如通过使用自定义分区器?

换句话说,问题将从“仅处理每个键的最新消息”变为“仅处理每个分区的最新消息”。 (拥有数千个分区来做到这一点是否是一个好主意,是另一个问题......)

我对普通

Consumer
以及 Kafka Streams PAPI 和 DSL 的答案感兴趣

example

apache-kafka apache-kafka-streams
2个回答
1
投票

我相信你的问题不是关于卡夫卡,而是关于流处理概念。此声明:

主题中的数据是实时数据,只有每个关键事项的最新消息

任何时刻的世界状态都是通过逐个应用每个事件来创建的。尽管中间的一些事件不会改变状态并且理论上可以被忽略,但您必须访问它们。

在您的情况下,除非您从头开始并扫描到末尾,否则您不会知道“key1”的哪些消息是最新的。在流媒体中,术语“结束”意味着现在,随着时间的推移而移动。因此,当您使用 Kafka 作为底层消息总线来设计实时应用程序时,您应该考虑必须按照消息生成的顺序处理所有消息。有些数据可能是垃圾或过时的。

如果您的消费者比生产者慢,请考虑添加更多分区以增加并行性,以避免积压。

最后,如果你坚持这个应用,你可以随时考虑KSQL。它通过维护状态并仅保留每个键的最新消息来完成您所要求的相同操作。 这不是一个普通的消费者流媒体应用程序


0
投票

如前所述,消费者不能选择仅接收每个密钥的最新消息。

但是,如果您拥有主题的配置,Kafka 有一个名为“日志压缩”的功能,允许主题丢弃那些较旧的冗余消息。

https://docs.confluence.io/kafka/design/log_compaction.html

© www.soinside.com 2019 - 2024. All rights reserved.