【问题标题】:How to decouple messaging middleware from microservices?如何将消息中间件与微服务解耦?
【发布时间】:2021-06-25 06:48:27
【问题描述】:

我们有很多由不同公司的不同团队用不同编程语言编写的微服务。所有这些服务都通过 RabbitMQ(AMQP) 中间件相互通信。每个微服务中都有消费者和发布者,它们分别监听传入的消息并在 RabbitMQ 交换上发布。当前架构如下图所示

我想将 RabbitMQ 特定的消费者和发布者从微服务中分离出来,并在一个单独的共享库中实现它们,如下所示。

此共享库应实现 RabbitMQ 交换绑定。此共享库中的使用者应收听任何传入消息并以目标语言调用相关方法。发布者也是一样,目标语言应该能够调用共享库中负责在 RabbitMQ 上发布消息的方法。

我想要一个共享库的原因是

  1. 由于我当前的服务直接实现 RabbitMQ 绑定,因此每个服务的集成测试用例也依赖于 RabbitMQ。
  2. 我可以轻松地将 RabbitMQ 替换为任何其他消息传递服务(例如 Kafka),而无需更改我的服务,因为这会使服务忽略底层消息传递服务。

我目前面临的问题是创建语言绑定。

如果我决定用Java编写共享库,由于大部分消息队列服务对Java都有很好的支持,如何实现语言绑定?

我仍在计划中,尚未开始实施。 请提供一些解决此问题的建议。

【问题讨论】:

  • 你确定这是可能的吗?不同的语言有不同的执行模型(解释与编译等)。我想让这个库与所有语言兼容是非常具有挑战性的。你不能为每种语言制作一个共享库的版本吗?
  • @CosminIoniță 我提到的服务是由不同公司的不同团队开发的。为每个服务创建一个包装器会增加潜在错误的可能性。更不用说编写额外的测试用例(单元、集成、应用程序)。这种共享库方法试图在不对现有服务进行重大更改的情况下将所有服务联系在一起。
  • 是的,不要这样做。
  • @SoftwareEngineer 如果您能分享解决此问题的替代方法,我将不胜感激。
  • 没有。你已经在做最简单的方法了。您可以将 rabbit 换成任何其他 amqp 代理,您的应用程序将继续运行。您选择了 amqp 抽象 - 消息传递。您不能编写允许您从 rabbit 更改为 Kafka 的抽象,因为它们是根本不同的范例,并且需要重新构建您的应用程序。没有人做得很好(虽然有一个 amq 连接器可以将 rabbit 连接到 Kafka,但这用于不同的目的,并且不允许您的客户通过 amqp 连接到 Kafka)

标签: architecture rabbitmq microservices message-queue


【解决方案1】:

您实际上并没有对它们进行解耦,您正在以一种困难的方式将耦合移动到一个库中,并且不容易维护。尝试关注KISS principle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2019-07-29
    • 2015-07-21
    • 2019-05-24
    • 2020-04-25
    • 2017-10-06
    • 2017-04-21
    • 2017-03-10
    相关资源
    最近更新 更多