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的响应。
在使用分布式队列的多节点体系结构中,一般方法是具有锁定机制。假设您有一个要处理的对象/请求,该对象/请求最初被放入队列中。任何实例都可以选择进行处理。你的逻辑应该像:
- 尝试获取对象的锁定。如果成功的过程呢。这将确保只有一个实例将选择一个时间。
- 处理请求并将其移动到另一个一致状态,以便当另一个实例选择它时,它应该具有所有信息
- 解锁。
在这种情况下,如果任何实例在您提到的第二步中选择响应,则不会出现问题。
另一种方法,以及锁定如下:
- 尝试锁定请求。如果成功。
- 如果成功,请将其从队列中删除
- 进行处理并转移到另一个一致的状态。
- 将对象放回队列并释放锁。
当然,正如@Constantin指出的那样,应该有一个链接将B的响应映射到原始对象。当一个对象可以被多个实例处理时,一致状态是另一个你应该关心的事情。不应该有任何信息存在于特定实例的内存中。
以上是关于MicroServices - 通过AMQP与多个接收器场景进行异步通信的主要内容,如果未能解决你的问题,请参考以下文章