【问题标题】:Microservice Architecture dependency微服务架构依赖
【发布时间】:2017-09-08 17:50:49
【问题描述】:

我已经阅读了很多关于微服务架构的内容,但有一件事我不明白如何实现,希望您能帮助我...

假设我有一个 web-api-endpoint 接收 OrderMicroservice 负责处理的订单。下订单时,必须更新库存,以便 OrderMS 向订阅者发布事件(使用例如 Nats 发布/订阅),并且 InventoryMS 将更新库存,因为它正在订阅当前事件/消息....我想要一个松散的耦合架构并使用对给定信息感兴趣的模块/MS的异步调用。

如果您有 1 个 InventoryMS 实例,给定场景将工作得非常好,但如果您水平扩展 InventoryMS 会发生什么,即有 5 个 InventoryMS 实例并且所有实例都订阅 inventory.change.event 并尝试更新库存?

对于像这种横向称为 MS 的场景,我应该使用哪种架构或消息模式,这样当 MS 相互依赖时,我可以拥有松散耦合的架构? 一种方法是内部通信是通过使用断路器模式的 REST 调用进行的,但后来我觉得我构建了一个具有一定智能的 MS 单体(断路器)......

感谢您的帮助!

【问题讨论】:

    标签: design-patterns architecture message-queue microservices


    【解决方案1】:

    您仍然可以使用 pub/sub 模型,但您需要设置多个实例,以便只有一个实例会收到消息。具体取决于pub/sub机制

    例如,在 AMQP 系统(如 RabbitMQ)中,您将在交换中发布事件。消费者服务会将队列绑定到该交换,并且同一服务的所有实例将从同一队列中读取(因此只有一个可以处理任何给定消息)

    另一个例子是 Kafka - 在 Kafka 中,同一服务的所有实例都将使用相同的 consumer group - 所以,同样,每个订阅服务的一个实例会收到消息

    其他发布/订阅系统也有类似的解决方案。

    指向特定实例并不是一个很好的解决方案,因为它会耦合不同服务的实例

    【讨论】:

    • ActiveMQ(destination:queue) 中的点对点在消费者端使用循环分发,因此如果您有更多消费者,它们将不会耦合到特定实例。但是你是对的,你也可以用 pub/sub 模型实现。
    【解决方案2】:

    使用点对点消息模型,只有一个消费者会收到消息。在发布/订阅模型中,所有订阅者都会收到通知。
    ActiveMQ 为例。

    【讨论】:

    • 好的,我将不得不使用 Nats 调查点对点消息传递 :),谢谢!
    • 如果你使用Java,例如检查AvtiveMQ
    猜你喜欢
    • 1970-01-01
    • 2014-11-25
    • 2015-09-03
    • 2020-05-21
    • 2022-01-08
    • 2021-05-12
    • 2020-12-09
    • 2019-04-01
    • 2015-12-26
    相关资源
    最近更新 更多