【问题标题】:Broadcast message in microservices and run it once in multiple instances在微服务中广播消息并在多个实例中运行一次
【发布时间】:2018-01-21 20:51:12
【问题描述】:

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

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

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

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

有没有办法解决这个问题?

【问题讨论】:

    标签: messaging microservices broadcast jgroups


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      如果您无法使用 RabbitMQ 等附加服务,请在广播前在消息头中添加 host-id(哪个 C 实例)。 C 实例检查标头,如果标头中存在其 id,它将处理。

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

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

      【讨论】:

        猜你喜欢
        • 2019-05-11
        • 2020-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-17
        • 2017-06-19
        • 2018-12-29
        • 1970-01-01
        相关资源
        最近更新 更多