Kafka Streams 中重新加密的消息顺序

Message order across rekeying in Kafka Streams

我想用额外的元数据丰富数据更改事件的主题(CDC 通过 Debezium);例如假设我有一个采购订单更改事件的主题,我想用更改事件起源的交易键入的元数据来丰富它。

我最初考虑通过事务 ID(包含在更改事件中)重新键入 "purchaseorder" KStream,因此我可以将其与事务元数据的 KStream 结合起来。在使用元数据丰富采购订单事件后,我将再次将其重新键入为原始订单 ID。

但我现在怀疑这是否会按预期工作:对于数据更改事件,保留事件的顺序至关重要,即对于一个采购订单(例如 123),所有事件都将具有相同的顺序密钥 (123),因此将进入 "purchaseorder" 主题的一个分区,然后将按生成它们的顺序由客户端使用。

现在,通过上述重新加密,一个采购订单的更改事件的顺序不会因为重新加密而重新调整吗?一张采购订单可能会被多次交易更改,因此 IIUC 通过交易 id 重新生成密钥可能会导致一张采购订单的事件在不同的分区中结束,从而使原始订购保证无效。

这点我有哪些选择?我现在正在考虑避免 rekey + join,而是在 "purchaseorder" 流上实现手动 transform() 方法,该方法将从状态存储中查找关联的交易数据。但是,在扩展的 Kafka Streams 应用程序中,如果给定订单事件的交易数据存储在不同的节点上(或使用 GlobalKTable 作为交易数据主题),则这意味着潜在的远程查找。

有没有推荐的替代品?

您不能将浓缩数据视为 table 吗? (这意味着它将把数据复制到你所有的处理节点,让你 "enrich in place")

如果你不能,并且愿意忍受延迟(并且有延迟的限制......) 您可以重新输入数据(您是对的,因为多个源分区现在可能会向任何目标分区生成数据,可能会发生重新排序),然后使用内存中的 window 将其重新排序(这是延迟限制的地方时间变得至关重要,并且在引入延迟的地方也是如此)并将其生成到另一个主题中...

用这种方式 运行 会相当昂贵,而且很脆弱。