Events 事件驱动的体系结构和事件结构

Events 事件驱动的体系结构和事件结构,events,architecture,soa,event-driven,eda,Events,Architecture,Soa,Event Driven,Eda,我是EDA新手,我读过很多关于优点的书,可能有兴趣在我的下一个项目中应用它,但仍然不了解一些东西 引发事件时,哪种模式最适合: 将事件命名为“CustomerUpdate”,并包括有关客户的所有信息(更新或未更新) 将事件命名为“CustomerUpdate”,并仅包含真正更新过的信息 将事件命名为“CustomerUpdate”,并包含最小信息(标识符)和/或URI,以便使用者检索有关此客户的信息 我问这个问题是因为我们的一些活动可能是繁重和频繁的 谢谢你的回答和时间 将事件命名为“Custo

我是EDA新手,我读过很多关于优点的书,可能有兴趣在我的下一个项目中应用它,但仍然不了解一些东西

引发事件时,哪种模式最适合:

  • 将事件命名为“CustomerUpdate”,并包括有关客户的所有信息(更新或未更新)
  • 将事件命名为“CustomerUpdate”,并仅包含真正更新过的信息
  • 将事件命名为“CustomerUpdate”,并包含最小信息(标识符)和/或URI,以便使用者检索有关此客户的信息
  • 我问这个问题是因为我们的一些活动可能是繁重和频繁的

    谢谢你的回答和时间

    将事件命名为“CustomerUpdate”

    首先,让我们从您的活动名称开始。事件的目的是描述已经发生的事情。这与命令不同,命令是针对尚未发生的事情发出指令

    您的事件名称“CustomerUpdate”在这方面听起来模棱两可,因为它可能是在描述过去或未来的事情

    CustomerUpdated会更好,但即使如此,Updated也是另一个模棱两可的术语,在业务上下文中是不特定的。为什么在这个实例中更新了客户?是因为他们更改了付款明细吗?搬回家了?他们是否从银牌升级为金牌?事件可以根据需要进行具体化

    这一点乍看起来似乎有些过分,但当您从事件负载中删除数据和上下文时,事件命名变得特别重要,更倾向于精简事件(问题中的“选项3”,我将在下面讨论)

    这并不是说在这个粒度级别定义事件总是合适的,只是说它是一条在项目早期向您开放的途径,以后可能会有回报(或者可能会让您被成千上万的事件类型淹没)

    回到您的实际问题,让我们依次考虑您的每个选项:

    将事件命名为“CustomerUpdate”,并包含所有信息(已更新 (或不)关于客户

    让我们把这个“模式”称为胖消息

    Fat消息(也称为快照)表示所述实体在给定时间点的状态,负载中存在所有事件上下文。它们很有趣,因为消息本身代表服务和消费者之间的契约。它们可用于在业务域之间传递状态的更改,在这种情况下,所有事件上下文最好在使用者的消息处理过程中出现

    优点:

    • 自洽-可以在不了解其他系统的情况下完全使用
    • 易于消费(upsert)
    缺点:

    • 脆性-服务和使用者之间的契约耦合到消息本身
    • 如果消息以错误的顺序到达,很容易用旧数据覆盖当前数据(提示:您可以通过使用该模式来缓解此问题)
    • 大的
    将事件命名为“CustomerUpdate”,并仅包含具有 真的更新了吗

    让我们把这种模式称为Delta消息

    Delta在许多方面类似于fat消息,尽管它们的生成和使用通常更加复杂。标准就是一个很好的例子

    因为它们只是事件实体的部分描述,所以Delta还附带了一个内置的假设,即消费者对所描述的事件有所了解。由于这个原因,它们可能不太适合发送到业务域之外,因为在业务域之外,事件实体可能并不为人所知

    在共享同一实体模型的系统之间同步数据时,delta真的很有用,理想情况下,delta保存在非关系存储中(例如,没有sql)。在这种情况下,可以检索实体,应用增量,然后以最小的努力再次保持

    优点:

    • 比胖消息小的消息
    • 在涉及共享实体模型的用例中表现出色
    • 可移植(如果基于jsonpatch等标准,或在较小程度上基于diffgram)
    缺点:

    • 与Fat消息类似,假设完全了解数据实体
    • 易于用旧数据覆盖当前数据
    • 要生成和使用的复杂性(特定用例除外)
    将事件命名为“CustomerUpdate”,并包含最少的信息 (标识符)和/或允许使用者检索信息的URI 关于这个客户

    让我们称之为瘦消息

    Skinny消息与您定义的其他消息模式不同,因为服务/使用者契约在消息中不再是显式的,而是隐含在消费者稍后将检索事件上下文中。这将分离契约和消息交换,这是一件好事

    这可能适合也可能不适合事件的跨业务域通信,这取决于企业的设置方式。由于事件有效负载非常小(通常是一个带有一些头的ID),因此除了事件名称之外,没有上下文可供使用者根据处理决策;因此,确保事件的名称正确变得更加重要,特别是当消费者可以通过多种方式处理CustomerUpdate消息时

    此外,在事件数据中包含实际资源地址可能不是一个好的做法,因为事件是已经发生的事情,事件消息通常是不可变的,因此事件中的任何信息都应该永远为真,以防事件需要重播。在这种情况下,资源地址很容易过时,事件将无法重新播放

    优点:

    • 将服务契约与消息分离
    • 信息