7

我正在阅读这篇名为“事件驱动架构中的变体”的文章,其中展示了中介和代理拓扑。

根据文章,中介拓扑看起来有点像这样:

中介拓扑

事件流从客户端向事件队列发送事件开始,事件队列用于将事件传输到中介。事件调解器接收初始事件并通过向事件通道发送额外的异步事件来编排该事件以执行流程的每个步骤。事件处理器,它监听事件通道,从偶数中介接收事件并执行特定的业务逻辑来处理事件 [...] 重要的是要注意,事件中介实际上并不执行必要的业务逻辑处理初始事件,相反,它知道处理事件所需的步骤 [...] 事件通道可以是消息队列或消息主题。

因此,我正在研究这个图表,试图了解中介如何确定给定处理器何时完成对给定事件的处理,以便它可以协调流程的下一步。

文章说的不够清楚

对于每个初始事件步骤,事件调解器创建一个处理事件,发送该处理事件并等待相应事件处理器处理该处理事件。这个过程一直持续到初始事件中的所有步骤都已处理完毕。

现在,文章清楚地表明通信是异步的,并且事件消息将通过消息队列传播,但是该图没有显示任何从事件处理器出来并返回到调解器的事件

文章说调解器等待事件处理器完成,但不清楚这在架构方面应该如何发生。

它是异步的、基于队列的 RPC(例如Rabbit RPC),还是有另一个侦听器在某处等待异步响应?

关于如何从架构的角度实现这一点的任何想法?

4

2 回答 2

4

在我看来,他们只是没有绘制从事件处理器返回的事件,可能是因为它们可能不是特定的事件(例如某种回调),或者因为它们可能不是正常事件(也许只是返回的事件到调解员,并且对任何其他订阅者不可见),具体取决于您用作调解员的内容。这部分似乎表明这样的事情:

事件中介可以以多种方式实现。了解每个实施选项,以确保您为事件调解器选择的解决方案符合您的需求。

事件中介的最简单和最常见的实现是通过开源集成中心,例如 Spring Integration、Apache Camel 或 Mule ESB。这些开源集成中心中的事件流通常通过 Java 代码或 DSL(领域特定语言)实现。对于更复杂的中介和编排,您可以将 BPEL(业务流程执行语言)与 BPEL 引擎(如开源 Apache ODE)结合使用。BPEL 是一种标准的类似 XML 的语言,它描述了处理初始事件所需的数据和步骤。对于需要更复杂的编排(包括涉及人工交互的步骤)的非常大的应用程序,您可以使用诸如 jBPM 之类的业务流程管理器 (BPM) 来实现事件中介。

了解您的需求并将它们与正确的事件中介器实现相匹配对于使用此拓扑的任何事件驱动架构的成功至关重要。使用开源集成中心进行非常复杂的业务流程管理编排是失败的秘诀,就像实施 BPM 解决方案来执行简单的路由逻辑一样。

他们提到 Spring 作为一种可能的实现——我从未使用过它,但查看文档(此处)我看到了回复通道的概念:

...当服务方法返回非空值时,端点将尝试将回复消息发送到适当的回复通道。


目标是发送一条或多条消息以异步处理,然后在结果返回时发送其他消息。我认为这些结果如何返回(函数回调、“响应”事件、Web API 调用等)在模式级别并不重要——这取决于您的特定基础设施。

对我来说,这听起来有点像 Saga 模式(链接)。在那里,Saga(或中介者)知道完成某些任务所需的步骤,并维护有关该任务进度的某些状态。

它触发要处理的命令并监听响应。当响应(事件)进入时,它会更新其状态,然后使用其状态来确定接下来需要触发哪些命令。

这种情况一直持续到 A) 过程完成,或 B) 过程中的一个步骤失败(在这种情况下,它可能会反转方向并开始触发补偿命令以“撤消”先前的操作)。

使用您引用的帖子中的下图,传奇/调解人的“想法”可能与......

  1. 重定位事件,因此触发更改地址命令并等待。
  2. 收到 AddressChanged 事件。现在我已经更改了地址,但我没有重新计算报价或更新索赔,所以我将把它们发送出去(它们不冲突,所以把它们都发送)然后等待。
  3. 收到 ClaimsUpdated 事件。在继续前进之前仍然需要重新计算,所以请继续等待。
  4. 收到 QuoteRecalced 事件。现在我已经更新了地址、重新计算了报价并更新了索赔,我可以发送 Adjust Claims 命令,然后等待。

... 等等。

您可能想要添加持久性(这样它可以在崩溃的情况下从中断的地方继续)、幂等事件处理器(因此重放事件不会导致问题)和/或超时(不会永远卡住等待如果响应事件丢失/丢失)。

图表

于 2018-06-14T22:24:49.577 回答
3

我认为您在图表本身上有答案:

初始事件步骤(红色)是关键。每个事件处理器都会产生一个事件,该事件会进入事件队列,然后进入事件调解器。

该架构是事件驱动和异步的。单个事件队列处理事件调解器的路径。由于这是将事件传入事件中介者的唯一方法,显然,任何想要向中介者发送事件的东西都需要使用这条路径。

在某个时刻,在某个事件之后,事件中介器将声明操作成功完成,并且不会向事件处理器发送更多事件。

虽然,我必须说,你是对的,但这并没有在文章中明确说明。我认为这将在他们正在预览的书中得到更好的说明。

于 2018-06-15T21:56:29.757 回答