Events 事件源中的事件使用者和重复代码 我对事件采购非常陌生,我们有一个领域,我们考虑应用事件采购。

Events 事件源中的事件使用者和重复代码 我对事件采购非常陌生,我们有一个领域,我们考虑应用事件采购。,events,architecture,microservices,cqrs,event-sourcing,Events,Architecture,Microservices,Cqrs,Event Sourcing,我们有一个应用程序,它将域事件存储到一个Oracle DB,事件的消费者将使用它们生成读取模型(所有读取模型将在内存中生成),这些消费者将主要使用轮询模型来获取事件 这意味着他们将获得一个请求,并基于该请求,他们将使用一个事件流并生成他们的读取模型,然后将其返回给调用者 比如说 事件生成API-->为类型A的聚合生成事件,并将其存储在Oracle数据库中 Consumer 1-->获取对特定类型a聚合的请求,然后它获取事件并重播它们以准备其读取模型 Consumer 2-->执行完全相同的操作,

我们有一个应用程序,它将域事件存储到一个
Oracle DB
,事件的消费者将使用它们生成读取模型(所有读取模型将在内存中生成),这些消费者将主要使用轮询模型来获取事件

这意味着他们将获得一个请求,并基于该请求,他们将使用一个事件流并生成他们的读取模型,然后将其返回给调用者

比如说

事件生成API
-->为类型A的聚合生成事件,并将其存储在Oracle数据库中

Consumer 1
-->获取对特定类型a聚合的请求,然后它获取事件并重播它们以准备其读取模型

Consumer 2
-->执行完全相同的操作,但呈现不同的读取模式

我们为什么要使用ES

  • 我们需要提供每次更改时的数据历史表示以及该更改时的聚合状态
  • 我们需要能够在每个事件的任何时间点获取聚合的快照,例如,在更改名称时,我们需要该名称更改事件时间的聚合状态
  • 我们需要表示时间点之间聚合状态的差异
  • 但所有这些要求都需要以民意调查的方式进行,这意味着消费者将在某个时间点(可能是最新的,也可能是以前的)要求查看

    问题1

    由于
    consumer 1
    consumer 2
    将执行基本相同的逻辑来重放事件,那么重放事件的代码应该在哪里?我们会实现一个公共库代码吗?这是否意味着我们将在消费者之间拥有重复的重播代码

    我担心,当我们更新事件模式时,我们需要更新多个使用者

    问题2

    这是一个很好的活动采购案例吗

    这意味着他们将获得一个请求,并基于该请求,他们将使用一个事件流并生成他们的读取模型,然后将其返回给调用者

    至少对我来说,这是一种奇怪的阅读模式。它似乎不是很快,速度是Read模型的优势之一

    一般来说,Read模型尽可能早地在后台处理事件(即在事件发出后的毫秒);结果保存在一个快速的数据库(磁盘或内存)中,并应用所有索引,因此当请求到来时,响应是快速的

  • 我们需要提供每次更改时的数据历史表示以及该更改时的聚合状态

  • 我们需要能够在每个事件的任何时间点获取聚合的快照,例如,更改名称,然后我们需要该名称更改事件的状态

  • 聚合的状态应该是隐藏的、私有的-聚合需要高级别的封装。也许您需要对在此之前生成的事件进行解释:这是读取模型的责任。聚合仅使用状态来决定它是否以及在下一个命令中将生成什么事件

    因此,我建议您设计一个读取模型,该模型正好做到这一点:它在平面(非事件源)持久性中为每个聚合维护另一个状态

  • 我们需要表示时间点之间聚合状态的差异
  • 同样,这应该通过读取模型来完成

    由于使用者1和使用者2将执行基本相同的逻辑来重播事件,那么重播事件的代码应该在哪里?我们会实现一个公共库代码吗?这是否意味着我们将在消费者之间拥有重复的重播代码

    但随后您说:
    Consumer 2-->做了完全相同的事情,但呈现了不同的读取模式。这意味着他们基本上不会做相同的事情。如果您引用的是从事件存储中获取事件并向使用者提供信息的代码,那么可以将其放入公共库中

    我担心我们在更新事件模式时需要更新多个使用者

    这是一个问题,但已经解决了

    这是一个很好的活动采购案例吗


    似乎是的,这可能是事件源的一种情况。

    问题是,在收到请求之前,我们无法真正生成读取模型,因为它们可能是随机的,并且可以在任何时间点请求数据。你能详细说明一下“聚合的状态应该是隐藏的、私有的——聚合需要高级别的封装。”我指的是域状态,或者我们的数据在那个时间点上的表现,消费者将向其提出请求的callerI还想提到,我们定期在传统的RDBMS表模式中保存数据的快照,这些事件消费者提供涉及历史数据的数据的不同表示events@engma在CQR中,根据定义,聚合(写入/命令模型)不能被查询。您(客户端代码、应用程序服务等)无法知道聚合内部是什么,它的状态对它来说是私有的。因此,您拥有读取模型;您构建它们是为了构造另一个适合查询需要的状态。在这种情况下,读取状态看起来很像写入/聚合的状态:这不重要,它们必须存储在不同的persisten中是的,因此我的事件消费者只会获取事件并使用它们来构建他们需要的表示或读取数据所需的模型。主要区别在于我们使用轮询模型,因此事件流将