gpt4 book ai didi

messaging - 在使用事件源的分布式系统中存储事件的位置?

转载 作者:行者123 更新时间:2023-12-04 11:59:33 25 4
gpt4 key购买 nike

鉴于您有多个由事件集成的系统,并且所有系统都使用事件源。你在哪里存储事件?

就我而言,我有三个系统:

  • 一个网站,一个店铺
  • 用于管理客户、产品等的网站后端
  • 一个会计系统

  • 每当域事件在其中一个系统中发生时,该事件就会被发布并且可以被其他系统处理。所有系统都在使用事件溯源。

    我想知道你会在哪里保存这些事件。当然,每个系统都必须存储它处理的所有事件,因为它使用事件源,因此依赖于它曾经处理过的事件。

    但是其他不需要且因此系统没有订阅的事件呢?我正在为需求可以改变这一事实而苦苦挣扎,以至于系统必须处理过去没有持续存在的事件。如果系统需要处理发生时它没有订阅的事件,您将从哪里获取这些事件?

    我认为此时不使用事件溯源的系统有很大的不同。如果您必须在依赖于数据的系统 A 中实现一个功能,该功能在 A 中不可用,但在另一个系统 B 中可用,并且您通过像 NHibernate 这样的 ORM 工具保持当前状态,您可以简单地将该数据从 A 导入到 B . 由于使用事件源的系统依赖于事件才能达到当前状态,因此您必须导入过去错过但现在需要的所有事件。

    对我来说,有几种不同的方法可以解决这个问题。
  • 每个系统保存所有发布的事件。这使您能够在需要时重新发布事件或将它们导入另一个系统。
  • 每个系统都保存所有发生的事件,甚至那些不需要处理的事件(还)。
  • 来自所有系统的所有事件都存储在中央事件日志中。如果您需要处理过去发生的事件但您没有订阅,您可以从这里导入它。

  • 你如何处理这种情况?你在哪里保存你的事件?

    编辑

    感谢 Roy Dictus 的回答。我仍然不确定如何处理以下情况:

    该网站发布事件 CustomerRegistered、CustomerPurchasedProduct 和 CustomerMarkedProductAsFavorite。
    在后端的当前版本中,必须显示客户并且必须显示他们的购买。客户标记为最喜欢的内容对该版本的系统不感兴趣。因此后端只订阅了 CustomerRegistered 和 CustomerPurchasedProduct。

    现在营销部门还希望在客户详细信息页面上显示有关喜欢的产品的信息。由于后端未订阅 CustomerMarkedProductAsFavorite,此信息在后端不​​可用。我从哪里得到这些信息?

    最佳答案

  • 每个系统都存储自己的事件。每个系统都是自己的 CQRS 系统,或者至少是自己独立的服务,因此对自己的数据负责。
  • 每个系统还将其事件发布到服务总线。此服务总线确定它保存这些事件的位置。通常它在事务排队系统中。
  • 每个系统订阅它使用的外部事件。它不存储这些传入事件,只存储由它们产生的自己的事件。当它使用传入事件时,服务总线知道它可以从该服务的传入队列中删除该事件。

  • 编辑 以解决您的额外问题:

    如果另一个应用程序突然对额外信息感兴趣,它必须向它现在感兴趣的事件添加监听器。

    此外,这些事件的所有来源都可以重播这些事件。重放是事件驱动系统的一个强大功能,它允许此类场景。因此,事件源仅重放选定的事件(例如,过去 6 个月的所有 CustomerMarkedItemAsFavorite 事件)。已经消耗了这些事件的系统应该认识到重放的事件是“旧”事件(即它已经处理过的事件)并忽略它们。

    这样,任何更新为使用来自其他子系统的额外信息的子系统都可以在单个批处理操作中获取该信息并获得所有最新信息。

    关于messaging - 在使用事件源的分布式系统中存储事件的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6238661/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com