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

11
我是一名有用的助手,可以为您翻译文本。
我正在阅读一篇名为事件驱动架构的变化的文章,在其中展示了中介者和代理人拓扑结构。
根据文章所述,中介者拓扑结构看起来有点像这样:

Mediator Topology

事件流程始于客户端将事件发送到“事件队列”,该队列用于将事件传输到中介者。事件中介者接收初始事件并通过向“事件通道”发送其他异步事件来编排该事件以执行每个步骤。监听事件通道的“事件处理器”从事件中介者接收事件并执行特定的业务逻辑以处理事件[...]需要注意的是,事件中介者实际上不执行处理初始事件所需的业务逻辑,而是知道处理事件所需的步骤[...]事件通道可以是消息队列或消息主题。
因此,我正在研究这个图表,试图理解中介者如何确定给定处理器何时完成处理给定事件,以便它可以编排过程的下一步。
当文章说到
对于每个初始事件步骤,事件中介者创建一个处理事件,发送该处理事件并等待相应的事件处理器处理该处理事件。该过程会继续进行,直到处理完初始事件中的所有步骤。
时,文章不够清晰。
现在,文章明确表示通信是异步的,并且事件消息将通过消息队列传递,但图表没有显示任何事件从事件处理器出来并返回到中介者。
文章说中介者等待事件处理器完成,但在架构术语中,这不清楚该如何发生。
这是异步的、基于队列的RPC(例如Rabbit RPC),还是有另一个监听器在等待异步响应吗?
从架构上考虑,您有什么想法如何实现?
2个回答

6
似乎他们只是没有绘制返回事件,可能是因为它们可能不是特定的事件(如某种回调)或者它们可能不是“正常”的事件(可能是仅返回到中介者并且对任何其他订阅者都不可见的事件),这取决于您使用的中介者。这部分似乎表明了这样的情况:
事件中介者可以以多种方式实现。了解每种实现选项,以确保您选择的事件中介者解决方案符合您的需求。
最简单和最常见的事件中介者实现方式是通过开源集成中心,如Spring Integration、Apache Camel或Mule ESB。这些开源集成中心中的事件流通常是通过Java代码或DSL(领域特定语言)实现的。对于更复杂的中介和编排,您可以使用BPEL(业务流程执行语言)结合开源Apache ODE等BPEL引擎。BPEL是一种描述处理初始事件所需数据和步骤的标准XML类似语言。对于需要更复杂的编排(包括涉及人员互动的步骤)的非常大型应用程序,您可以使用诸如jBPM之类的业务流程管理器(BPM)来实现事件中介者。
了解您的需求并将其与正确的事件中介者实现相匹配对于使用此拓扑的任何事件驱动架构的成功至关重要。使用开源集成中心进行非常复杂的业务流程管理编排是失败的配方,就像实现BPM解决方案来执行简单的路由逻辑一样。
他们提到了Spring作为可能的实现方式-我从未使用过,但是通过查看文档(这里),我发现了回复通道的概念:

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


目标是将一个或多个消息异步发送进行处理,然后在结果返回时发送其他消息。在模式级别上,我认为这些结果以何种方式返回并不重要(函数回调、'response'事件、Web API调用等)- 这将取决于您特定的基础设施。
对我来说,这听起来很像Saga模式(link)。在其中,Saga(或Mediator)知道完成某些任务所需的步骤,并维护有关该任务进度的某些状态。
它会发出要处理的命令并侦听响应。当响应(事件)到达时,它会更新其状态,然后使用其状态确定需要发出哪些命令。
这将继续,直到A)过程完成,或B)过程中的某个步骤失败(在这种情况下,它可能会反转方向并开始发出补偿命令以“撤消”先前的操作)。
使用您引用的帖子下面的图表,Saga / Mediator的“想法”可能如下...
  1. 迁移事件,因此触发更改地址命令并等待。
  2. 收到地址更改事件。现在我已经更改了地址,但我还没有重新计算报价或更新索赔,所以我会发送它们(它们不冲突,因此同时发送)并等待。
  3. 收到索赔更新事件。仍需要重新计算才能继续前进,因此继续等待。
  4. 收到报价重新计算事件。现在我已经更新了地址,重新计算了报价并更新了索赔,我可以发送调整索赔命令并等待。

...等等。

您可能希望添加持久性(以便在崩溃的情况下可以从上次离开的地方继续),幂等事件处理程序(以便重放事件不会引起问题)和/或超时(以防止永远等待如果响应事件丢失/丢失)。

Diagram


5

我认为你已经在图表上找到了答案:

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

该架构是事件驱动的和异步的。单个事件队列处理通向事件中介的路径。既然这是唯一将事件送入事件中介的方法,那么想要向中介发送事件的任何内容都需要使用此路径。

在某些事件之后,事件中介将宣布操作成功完成,并且不会向事件处理器分派更多事件。

虽然,我必须说,你是对的,文章中没有清楚地说明这一点。我认为在他们预览的书中将更好地阐明这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接