Architecture 如何将消息传递中间件与微服务分离?

Architecture 如何将消息传递中间件与微服务分离?,architecture,rabbitmq,microservices,message-queue,Architecture,Rabbitmq,Microservices,Message Queue,我们有一系列由跨越不同公司的不同团队用不同编程语言编写的微服务。所有这些服务都通过RabbitMQ(AMQP)中间件相互通信。每个微服务中都有消费者和发布者,它们分别侦听传入消息并在RabbitMQ交换上发布。当前架构如下图所示 我希望将特定于RabbitMQ的使用者和发布者与微服务分离,并在单独的共享库中实现它们,如下所示 此共享库应实现RabbitMQ交换绑定。此共享库中的使用者应侦听任何传入消息并调用目标语言中的相关方法。对于发布者也是一样,目标语言应该能够调用共享库中负责在Rabbi

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

我希望将特定于RabbitMQ的使用者和发布者与微服务分离,并在单独的共享库中实现它们,如下所示

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

我想要共享库的原因是

  • 由于我当前的服务直接实现RabbitMQ绑定,因此每个服务的集成测试用例也依赖于RabbitMQ
  • 我可以轻松地将RabbitMQ交换为任何其他消息传递服务(例如Kafka),而无需更改我的服务,因为这会使服务忽略底层消息传递服务
  • 我目前面临的问题是创建语言绑定

    如果我决定用Java编写共享库,因为大多数消息队列服务都很好地支持Java,那么如何实现语言绑定呢

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

    您实际上并没有对其进行解耦合,而是以一种困难的方式将耦合移动到lib,不容易维护。尝试遵循

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