关于事件驱动拓扑中的中介

时间:2017-10-14 08:00:14

标签: events microservices event-driven orchestration event-driven-design

我正在阅读这篇名为Variations in event-driven architecture的文章,其中他们展示了调解员和代理拓扑。

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

Mediator Topology

  

事件流程从客户端向事件队列发送事件开始,该事件队列用于将事件传输到介体。 事件介体接收初始事件,并通过向事件通道发送其他异步事件来协调该事件,以执行该过程的每个步骤。 事件处理器,监听事件通道,从偶数调解器接收事件并执行特定的业务逻辑来处理事件[...]重要的是要注意事件调解员不会&#39 ; t实际上执行处理初始事件所必需的业务逻辑,而是知道处理事件所需的步骤[...]事件通道可以是消息队列o消息主题。

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

文章说不清楚

  

对于每个初始事件步骤,事件介体创建一个处理事件,发送该处理事件并等待,以便由相应的事件处理器处理该处理事件。此过程将继续,直到初始事件中的所有步骤都已处理完毕。

现在,文章很清楚,通信是异步的,事件消息将通过消息队列,但图表不显示来自事件处理器并返回介体的任何事件

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

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

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

2 个答案:

答案 0 :(得分:2)

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

  

事件调解员可以通过多种方式实施。了解每个实施选项,以确保您的解决方案   选择活动调解员符合您的需求。

     

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

     

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

他们提到Spring是一种可能的实现方式 - 我从未使用过它,但是查看文档(here)我看到了回复频道的概念:

  

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

目标是发送一个或多个消息以异步处理,然后在结果返回时发送其他消息。我不认为在模式级别上确切地说这些结果是如何回归的(函数回调,响应'事件,Web API调用,等等) - 这将取决于您的特定基础结构。

对我而言,这听起来有点像Saga模式(link)。在那里,Saga(或Mediator)知道完成某项任务所需的步骤,并保持关于该任务进展的一些状态。

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

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

使用您所引用的帖子中的下图,"想法"传奇/调解员可能是......

  1. 重定位事件,因此请关闭“更改地址”命令并等待。
  2. 收到AddressChanged事件。现在我已经更改了地址,但是我还没有重新报告或更新了声明,因此我会将这些声明发送出去(它们不会发生冲突,因此请将它们发送给我们)并等待
  3. 已收到ClaimsUpdated事件。在继续前进之前仍需要重新计算,所以请继续等待。
  4. 收到QuoteRecalced事件。既然我已经更新了地址,重新调整了报价并更新了声明,我可以发送“调整声明”命令,然后等待。
  5. ......等等。

    您可能希望添加持久性(因此它可以在发生崩溃时从中断处继续),幂等事件处理器(因此重放事件不会导致问题)和/或超时(到如果响应事件丢失/丢失,请不要永远等待。

    Diagram

答案 1 :(得分:1)

我认为你在图表上有答案:

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

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

在某些时候,在某个事件之后,Event Mediator会将操作声明为成功完成,并且不会向事件处理器分发更多事件。

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