与Kafka在多语言制作者之间共享分区逻辑

时间:2019-01-28 07:31:33

标签: apache-kafka partitioning event-sourcing anonymize

我们正在依靠Kafka在我的公司中构建事件源系统。

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

我们的想法是使用压缩和逻辑删除功能。

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

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

问题在于我们正在一个多语言环境中发展(我们拥有php,python和Java / Kotlin服务发布和使用事件)。

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

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

PHP本身支持广泛的hashing algorithms,但我们很难在其他语言中找到相同的支持。

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

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

有人会在多语言环境中使用Kafka建立活动商店的经验,请在这个特定主题上向我们重点介绍吗?

0 个答案:

没有答案