如何将消息中间件与微服务解耦?

问题描述

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

enter image description here

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

enter image description here

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

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

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

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

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

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

解决方法

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