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

时间:2018-03-02 04:02:35

标签: asynchronous microservices amqp servicebus

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

  1. 尝试获取对象的锁定。如果成功的过程呢。这将确保只有一个实例将选择一个时间。
  2. 处理请求并将其移至另一个一致状态,以便当另一个实例选择它时,它应该包含所有信息
  3. 解锁。
  4. 在这种情况下,如果任何实例在您提到的第二步中选择响应,则不会出现问题。

    另一种方法,与锁定一样:

    1. 尝试锁定请求。如果成功。
    2. 如果成功,请将其从队列中删除
    3. 进行处理并转移到另一个一致状态。
    4. 将对象放回队列并释放锁定。
    5. 当然,正如@Constantin指出的那样,应该有一个链接将B的响应映射到原始对象。当一个对象可以被多个实例处理时,一致状态是另一个你应该关心的事情。不应该有任何信息存在于特定实例的内存中。