在微服务中广播消息并 运行 在多个实例中广播一次
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 实例之间的负载平衡进一步改进。
我正在使用微服务,假设我有 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 实例之间的负载平衡进一步改进。