鉴于REST API具有以下操作,导致事件发布到Kafka:
多个用户可以同时使用REST API的环境,并且消费者必须都获得相同的事件。消费者可能长时间离线(超过一天)。可能会添加新的消费者,并删除其他消费者。
问题:
还有其他系统更适合这个问题吗?
答案 0 :(得分:1)
根据我在活动采购方面的经验,我会给你一个部分答案。
事件排序(仅解决单个主题/分区?)
AddCtem在AddCategory之前,无效的类别引用。
AddCtem之前的UpdateItem,曾经是一个有效的引用,现在无效。
- AddItem之前的RemoveCategory,类别引用无效。
- ....其他并发问题的无限列表。
醇>
所有可扩展的事件存储,我知道仅在分区内部进行的保证事件。在DDD术语中,事件存储通过按生成顺序重放事件来确保正确地重新水合聚合。 Apache-kafka主题似乎是一个不错的选择。虽然这对于应用程序的写入端来说已经足够了,但是Read端更难以使用它。更难但不是不可能。
鉴于事件已经由Write端验证(因为它们代表已经发生的事实),我们可以确定系统中出现的任何不一致是由于事件的错误排序。此外,鉴于Read端最终与Write端一致,丢失的事件最终将到达我们的Read模型。
首先,在你的情况下AddItem before AddCategory, invalid category reference
,事实上应该是ItemAdded before CategoryAdded
(条款是过去的)。
其次,当ItemAdded
到达时,您尝试按ID加载类别,如果失败(因为延迟的 CategoryAdded
事件),那么您可以创建一个{ {1}} ID等于NotYetAvailableCategory
事件中引用的ID,标题为“Not Yet Available请等待几毫秒”。然后,当ItemAdded
事件到达时,您只需更新引用该类别ID的所有CategoryAdded
。 因此,主要想法是您创建临时实体,这些实体将在其事件最终到达时完成。
对于Items
,当CategoryRemoved before ItemAdded, category reference invalid
事件到来时,您可以检查该类别是否已删除(通过ha ItemAdded
读取模型)然后采取相应的操作您的ListOfCategoriesThatWereDeleted
实体 - 取决于您的业务。