在微服务中广播消息并在多个实例中运行一次
问题描述:
我正在使用微服务,假设我有3个服务,并且它们都通过JGroup UDP通道相互连接(JGroups可以在它们之间广播消息):在微服务中广播消息并在多个实例中运行一次
--- --- ---
| A | --msg--> | B || C |
--- --- ---
如果我只有一个服务的实例,一切都很好。但是,例如,如果我有两个服务实例C
,它们都会收到该事件,并且它们都将运行自己的过程,并且结果将在数据库中重复(总计两次)。
--- --- --- ---
| A | --msg--> | B || C || C |
--- --- --- ---
有什么办法可以管理吗?
答
创建每个微服务一个单独的队列(如果尚未创建)
兔MQ,使用扇出交易所因此每个队列将reacieve所有消息。
现在,如果单个微服务的多个实例绑定到相同的队列,那么只有一个实例将能够从该队列中选择一条消息。由于队列的循环性质,
答
如果您不能使用像RabbitMQ这样的附加服务,请在广播之前在邮件标题中添加主机标识(C实例)。 C实例检查头,如果它的ID存在于它将处理的头中。
该机制要求每个实例都有其他正在运行的实例的准确信息。
您可以通过C实例之间的负载平衡进一步改进。