微服务 - 通过 AMQP 与多个接收者场景进行异步通信

MicroServices - Async Communication via AMQP with multiple receivers scenario

使用微服务方法,我有带有 3 个实例(A1、A2、A3)的服务 A,它们可以通过基于 AMQP 消息的异步通信与具有(B1、B2、B3)实例的服务 B 通信。例如,通过 Azure 服务总线队列。

服务 A 的操作实施的一部分,我有 5 个步骤需要注意,5 个步骤中的第 2 步是联系服务 B 以获取一些信息并继续进行。

当我使用多接收器方法时,服务 A 的 A2 实例如何处理来自服务 B 的响应,而实际请求是由 A1 实例发出的。

我想知道微服务中的多发送者+多接收者方法是如何处理这些场景的。

为了使来自任何服务 B 实例的响应能够由任何服务 A 实例处理,来自 B 的响应必须包含识别来自 A 的请求并恢复请求所需的所有信息进程,即实体 ID、进程 ID 或最有可能对 B 不透明的东西。

此外,这意味着 A1(或任何向 B 发送请求消息的实例)不应阻止或等待 B 的响应。

在使用分布式队列的多节点体系结构中,一般方法是使用锁定机制。 假设您有一个 object/request 需要处理,它最初被放入队列。任何实例都可以选择它进行处理。你的逻辑应该是这样的:

  1. 尝试获取对象的锁。如果成功处理它。这将确保 tt 一次只有一个实例会选择。
  2. 处理请求并将其移动到另一个一致的状态,以便当另一个实例选择它时,它应该具有所有信息
  3. 解除锁定。

在这种情况下,如果任何实例在您提到的第二步中选择响应,都不会出现问题。

另一种方法,连同锁定是这样的:

  1. 尝试锁定请求。如果成功。
  2. 如果成功,将其从队列中移除
  3. 进行处理并移动到另一个一致状态。
  4. 将对象放回队列并释放锁。

当然,正如@Constantin 所指出的,应该有一个 link 来将 B 的响应映射到原始对象。当一个对象可以由多个实例处理时,一致性状态是您应该关心的另一件事。不应有任何信息驻留在特定实例的内存中。