Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design 当真相的来源是阿帕奇·卡夫卡时,如何生成身份?_Domain Driven Design_Apache Kafka_Cqrs_Event Sourcing - Fatal编程技术网

Domain driven design 当真相的来源是阿帕奇·卡夫卡时,如何生成身份?

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。当用户下新订单时,我会在日志中添

我正在构建一个由两个微服务组成的系统。他们将遵循CQR、ES和DDD协议。我想用阿帕奇·卡夫卡作为“真相之源”——正如杰伊·克雷普斯在Confluent和LinkedIn的工程博客上的许多材料中所说的那样

我的问题和主要问题是:

当Apache Kafka成为真相来源时,如何为新实体生成身份?

例如:

我有一个订单(在网上商店)。因为卡夫卡是我的真理之源,所以我想先将数据放入卡夫卡,然后使用卡夫卡的数据填充一些数据库,例如MySQL或Elastic Search。当用户下新订单时,我会在日志中添加一个“newOrder”事件,其中包含订单的详细信息(已订购的物品和数量、客户数据、发货地址等)。我希望订单有一个ID,以便在MySQL和弹性搜索中填充数据时使用它

你知道一些技巧和最佳实践吗?我如何为订单分配ID(身份)

当使用MySQL作为真相来源时,这将很容易。在这种情况下,我将有一些“id”列,MySQL将在其中分配一个id整数

编辑
我知道GUID的概念,但我正在寻找其他一些概念。

有一个“简单”的解决方案,但正如您将看到的,它在实践中变得更加复杂

代理为kafka中的每条消息分配了唯一的偏移量id(64位长)。它是一种类似sql的序列,随消息单调增加,总是与实际负载(键/消息)一起发送到客户端。它是kafka协议的核心(客户端通过向代理发送上次看到的偏移量来保持轮询数据),所以它不会随着新版本的出现而消失

只要您有一个永远不会失败的分区,它就是问题的完美解决方案——有序的人工密钥,可以放入单个db列中,在重播kafka流时,它会像预期的那样重新出现(然后您可以将其与数据库协调,执行升级,或者在pk冲突时失败)。您可能真的不希望pk复制失败,因为在应用程序崩溃的情况下,kafka会重新向您发送部分已看到的消息,因此某种类型的upsert/协调更好。在任何情况下,它都应该能够正常工作

使用多个分区会使事情变得更加复杂(这在卡夫卡中很常见)。偏移量只在单个分区的上下文中是唯一的,并且分区之间没有数字的关系-所以ID 1000分区0可能比ID 5000分区1晚很多(“稍后”在引号中,因为当您以适当的方式考虑帕金斯时,您不应该真正考虑它们之间的时间顺序)。这意味着:

  • 您需要使用分区id丰富主键,分区id看起来不再那么漂亮了

  • 您失去了良好的视觉副作用,所有的订单都被主键及时正确地排序

只要您的卡夫卡集群没有发生灾难性故障,这仍然可以正常工作。如果您需要完全干净地重新启动kafka/zookeeper环境,所有偏移量将重置为0。我不知道有什么方法可以让他们从更高的数字开始(有很多方法可以改变消费者补偿,但我还没有找到任何方法可以改变生产者/经纪人的补偿)。在这一点上,您的整个逻辑都被破坏了,并且没有任何简单的方法可以从该状态中恢复(除了可能更改代码并执行类似于假设partitionid=partitionid+100之类的技巧,有效地添加主键的第三部分,即“生成id”)

据我所知,假设卡夫卡永远不会以这种方式出现故障-如果配置得当,将出现副本、故障切换、滚动更新等。但您是否打算将您的整个设计押在永远不会耗尽内存、磁盘空间,从过时的旧格式更新卡夫卡时,新版卡夫卡中存在普通错误等问题


您可能想和对kafka有更多经验的人谈谈-我们在开发过程中遇到过几次需要干净安装的主要问题(总是我们的错误-达到物理RAM限制,让linux OOM杀死随机的东西,磁盘空间不足,或者破坏docker启动/装载)。可能,通过更多的努力,在任何情况下都有可能恢复旧状态,我们只是通过重置所有内容(这是dev,我们不依赖于外部偏移量)来实现廉价的恢复。有一个“简单”的解决方案,但正如您将看到的,它在实践中变得更加复杂

代理为kafka中的每条消息分配了唯一的偏移量id(64位长)。它是一种类似sql的序列,随消息单调增加,总是与实际负载(键/消息)一起发送到客户端。它是kafka协议的核心(客户端通过向代理发送上次看到的偏移量来保持轮询数据),所以它不会随着新版本的出现而消失

只要您有一个永远不会失败的分区,它就是问题的完美解决方案——有序的人工密钥,可以放入单个db列中,在重播kafka流时,它会像预期的那样重新出现(然后您可以将其与数据库协调,执行升级,或者在pk冲突时失败)。您可能真的不希望pk复制失败,因为在应用程序崩溃的情况下,kafka会重新向您发送部分已看到的消息,因此某种类型的upsert/协调更好。在任何情况下,它都应该能够正常工作

使用多个分区会使事情变得更加复杂(这在卡夫卡中很常见)。偏移量仅在单个分区的上下文中是唯一的,分区之间没有数字关系,所以ID1000分区0可能比ID5000分区1“晚”很多(