MicroServices - 通过AMQP与多个接收器场景进行异步通信

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MicroServices - 通过AMQP与多个接收器场景进行异步通信相关的知识,希望对你有一定的参考价值。

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

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

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

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

答案

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

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

另一答案

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

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

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

另一种方法,以及锁定如下:

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

当然,正如@Constantin指出的那样,应该有一个链接将B的响应映射到原始对象。当一个对象可以被多个实例处理时,一致状态是另一个你应该关心的事情。不应该有任何信息存在于特定实例的内存中。

以上是关于MicroServices - 通过AMQP与多个接收器场景进行异步通信的主要内容,如果未能解决你的问题,请参考以下文章

使用 AMQP 和 Vert.x 实现微服务间的异步通信

Azure IoT 中心 AMQP 通信多路复用

使用 Qpid 通过 SSL 与 AMQP 1.0 代理通信

转: RabbitMQ实现中AMQP与MQTT消息收发异同

AWS 云计算环境中的Microservices 架构

微服务(Microservices )简介