Domain driven design 当真相的来源是阿帕奇·卡夫卡时,如何生成身份?
我正在构建一个由两个微服务组成的系统。他们将遵循CQR、ES和DDD协议。我想用阿帕奇·卡夫卡作为“真相之源”——正如杰伊·克雷普斯在Confluent和LinkedIn的工程博客上的许多材料中所说的那样 我的问题和主要问题是: 当Apache Kafka成为真相来源时,如何为新实体生成身份? 例如: 我有一个订单(在网上商店)。因为卡夫卡是我的真理之源,所以我想先将数据放入卡夫卡,然后使用卡夫卡的数据填充一些数据库,例如MySQL或Elastic Search。当用户下新订单时,我会在日志中添加一个“newOrder”事件,其中包含订单的详细信息(已订购的物品和数量、客户数据、发货地址等)。我希望订单有一个ID,以便在MySQL和弹性搜索中填充数据时使用它 你知道一些技巧和最佳实践吗?我如何为订单分配ID(身份) 当使用MySQL作为真相来源时,这将很容易。在这种情况下,我将有一些“id”列,MySQL将在其中分配一个id整数 编辑Domain driven design 当真相的来源是阿帕奇·卡夫卡时,如何生成身份?,domain-driven-design,apache-kafka,cqrs,event-sourcing,Domain Driven Design,Apache Kafka,Cqrs,Event Sourcing,我正在构建一个由两个微服务组成的系统。他们将遵循CQR、ES和DDD协议。我想用阿帕奇·卡夫卡作为“真相之源”——正如杰伊·克雷普斯在Confluent和LinkedIn的工程博客上的许多材料中所说的那样 我的问题和主要问题是: 当Apache Kafka成为真相来源时,如何为新实体生成身份? 例如: 我有一个订单(在网上商店)。因为卡夫卡是我的真理之源,所以我想先将数据放入卡夫卡,然后使用卡夫卡的数据填充一些数据库,例如MySQL或Elastic Search。当用户下新订单时,我会在日志中添
我知道GUID的概念,但我正在寻找其他一些概念。有一个“简单”的解决方案,但正如您将看到的,它在实践中变得更加复杂 代理为kafka中的每条消息分配了唯一的偏移量id(64位长)。它是一种类似sql的序列,随消息单调增加,总是与实际负载(键/消息)一起发送到客户端。它是kafka协议的核心(客户端通过向代理发送上次看到的偏移量来保持轮询数据),所以它不会随着新版本的出现而消失 只要您有一个永远不会失败的分区,它就是问题的完美解决方案——有序的人工密钥,可以放入单个db列中,在重播kafka流时,它会像预期的那样重新出现(然后您可以将其与数据库协调,执行升级,或者在pk冲突时失败)。您可能真的不希望pk复制失败,因为在应用程序崩溃的情况下,kafka会重新向您发送部分已看到的消息,因此某种类型的upsert/协调更好。在任何情况下,它都应该能够正常工作 使用多个分区会使事情变得更加复杂(这在卡夫卡中很常见)。偏移量只在单个分区的上下文中是唯一的,并且分区之间没有数字的关系-所以ID 1000分区0可能比ID 5000分区1晚很多(“稍后”在引号中,因为当您以适当的方式考虑帕金斯时,您不应该真正考虑它们之间的时间顺序)。这意味着:
- 您需要使用分区id丰富主键,分区id看起来不再那么漂亮了
- 您失去了良好的视觉副作用,所有的订单都被主键及时正确地排序
您可能想和对kafka有更多经验的人谈谈-我们在开发过程中遇到过几次需要干净安装的主要问题(总是我们的错误-达到物理RAM限制,让linux OOM杀死随机的东西,磁盘空间不足,或者破坏docker启动/装载)。可能,通过更多的努力,在任何情况下都有可能恢复旧状态,我们只是通过重置所有内容(这是dev,我们不依赖于外部偏移量)来实现廉价的恢复。有一个“简单”的解决方案,但正如您将看到的,它在实践中变得更加复杂 代理为kafka中的每条消息分配了唯一的偏移量id(64位长)。它是一种类似sql的序列,随消息单调增加,总是与实际负载(键/消息)一起发送到客户端。它是kafka协议的核心(客户端通过向代理发送上次看到的偏移量来保持轮询数据),所以它不会随着新版本的出现而消失 只要您有一个永远不会失败的分区,它就是问题的完美解决方案——有序的人工密钥,可以放入单个db列中,在重播kafka流时,它会像预期的那样重新出现(然后您可以将其与数据库协调,执行升级,或者在pk冲突时失败)。您可能真的不希望pk复制失败,因为在应用程序崩溃的情况下,kafka会重新向您发送部分已看到的消息,因此某种类型的upsert/协调更好。在任何情况下,它都应该能够正常工作 使用多个分区会使事情变得更加复杂(这在卡夫卡中很常见)。偏移量仅在单个分区的上下文中是唯一的,分区之间没有数字关系,所以ID1000分区0可能比ID5000分区1“晚”很多(