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