1

我们正在我的公司构建一个事件源系统,依赖于 Kafka。

为了符合 GDPR,我们需要能够更新事件。

我们的想法是使用压缩和墓碑功能。

这意味着我们不能使用默认的分区策略,因为我们希望每条消息都有一个唯一的键(为了覆盖特定的消息),但我们仍然希望发生在同一个聚合上的事件在同一个分区上结束。

这使我们创建了一个自定义分区器(基本上复制了默认分区器的“哈希模”逻辑,但使用与消息键不同的值来计算哈希)。

问题是我们正在多语言环境中发展(我们有 php、python 和 Java/Kotlin 服务发布和消费事件)。

我们希望确保所有这些服务都会在给定特定分区键的情况下向同一个分区生成消息(以防不同的服务将事件发布到同一个主题)。

我们的主要想法是使用一种通用的散列算法,但我们发现很难找到一个既具有强大的分布保证又具有良好稳定性的算法(不仅仅是实验库的一部分)。

PHP 本身支持广泛的散列算法,但我们发现很难在其他语言中找到相同的支持。

由于 Kafka 默认分区器依赖于 murmur2,我们也开始朝这个方向寻找。不幸的是,php 本身并不支持它(尽管存在一些实现)。此外,该算法使用种子,这意味着我们需要为所有发布者服务使用完全相同的种子,这开始使该方法看起来相当复杂。

但是,我们可能从错误的角度看待设计。跨多语言服务共享事件存储写入功能可能不是一个好主意,并且每个服务都可以有自己的分区逻辑,只要它确保“每个聚合一个分区”的要求。问题是我们必须提前考虑这一点,因为没有任何技术保障措施可以防止将来某个服务在“共享”事件流上发布(并且不使用完全相同的分区逻辑会在发生时产生巨大影响)。

是否有人有在多语言环境中使用 Kafka 构建事件存储的经验,并且可以就这个特定主题向我们强调一下,好吗?

4

0 回答 0