在微服务中广播消息并 运行 在多个实例中广播一次

Broadcast message in microservices and run it once in multiple instances

我正在使用微服务,假设我有 3 个服务并且它们都通过 JGroup UDP 通道相互连接(JGroups 可以在它们之间广播消息):

 ---            ---  ---
| A | --msg--> | B || C |
 ---            ---  ---

如果每个服务只有一个实例,一切都很好。但是,例如,如果我有两个服务实例 C,它们都将接收事件,并且它们都将 运行 它们自己的过程,结果将在数据库中重复(求和值两次)。

 ---            ---  ---  ---
| A | --msg--> | B || C || C |
 ---            ---  ---  ---

有什么办法可以解决这个问题吗?

为每个微服务创建一个单独的队列(如果尚未创建)

在 Rabbit MQ 中,使用 Fanout Exchange 因此每个队列都会收到所有消息。

现在,如果单个微服务的多个实例与同一个队列绑定,那么只有一个实例能够从该队列中选择一条消息queue.Due以适应队列的循环性质。

如果您不能使用像RabbitMQ这样的附加服务,在您广播之前在消息header中添加host-id(which C instance)。 C 实例检查 header,如果其 id 存在于 header 中,它将处理。

此机制要求每个实例都具有其他 运行 个实例的准确信息。

您可以通过 C 实例之间的负载平衡进一步改进。