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

时间:2017-08-14 04:09:51

标签: messaging microservices broadcast jgroups

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

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

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

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

有没有办法管理这个?

2 个答案:

答案 0 :(得分:3)

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

在Rabbit MQ中,使用扇出交换,因此每个队列都会重新获取所有消息。

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

答案 1 :(得分:0)

如果您无法使用RabbitMQ等附加服务,请在广播前在邮件标题中添加host-id(哪个C​​实例)。 如果标题的ID存在于它将处理的标题中,则C实例检查标题。

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

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