有没有办法判断两个kafka主题中哪个事件先发生

Is there a way to tell which event occurred first in two kafka topics

如果我在 kafka 中有两个主题,是否有一种方法可以判断一个主题中的一个事件是否在另一个主题中的事件之前“发生”,如果它们都在彼此的一毫秒内发生,即它们具有相同的事件时间戳?

背景: 我正在构建一个基于事件源的事件驱动架构。通常,当一个事件在一个主题中发生时,我需要进行扫描以查找在第二个主题中是否已经发生了一个单独的事件。同样的,如果第二个topic中的事件来了,我需要扫描一下topic 1中的事件是否发生了。

为了不重复处理,我需要一种确定性的方式来对事件进行排序。如果事件相隔超过 1 毫秒,我可以只使用事件中的时间戳。但是,因为kafka时间戳只到毫秒,当两个事件发生的时间很近时,我就不能再使用这种方法了。

实际上,我不在乎哪个主题“先”出现,即如果 kafka 一个先于另一个发布,即使它们以不同的顺序出现,我也不在乎。我只需要一种确定的方式来订购它们。

实际上,我可以使用一些方法,例如按主题按字母顺序排列事件,但希望有一个内置的机制。 (不想引入奇怪的错误,因为我总是在事件 B 之前处理事件 A;不太可能,但我已经看到它发生了)

PS 我愿意接受其他想法。我在考虑这种方法,因为它在 redis 流中是可能的。然而,因为我无法控制的事情,我被限制在kafka。我确实想避免使用外部数据存储,因为那时我需要开始担心那里的数据同步。

无论如何,您将 运行 陷入同步问题。例如 - 您可以尝试在 Kafka Streams 中使用 stream-topic 加入。如果连接的事件不存在,那么它还没有发生,但是你依赖于在构建 KTable 的消费者进程中绝对零滞后。

您可以尝试将纳秒存储为值的一部分,或者如果您需要更高的精度,则在创建记录时 header,但同样,您将需要绝对零滞后或非常精确的消费者调查具有一些比较的事件 window 因为 Kafka 不提供跨多个主题的任何处理保证