基于微服务的应用程序中 RabbitMQ 队列绑定管理的中心位置

问题描述 投票:0回答:1

我正在开发一个基于微服务的应用程序。它是由约建造的。 30 个微服务,通常其中一些微服务通过 RabbitMQ 相互通信。

此类服务的配置文件中有交换器、队列和路由键的名称 (

application.yml
)。 所有相应的 bean(包括绑定)都是在
@Configuration
中创建的。 所有这些都是在服务启动时自动创建的。

由于这是一个启动项目,其特点是在设计、交换器重命名、路由键、队列等方面进行了大量更改。

因此,如果有一个可以管理所有必要绑定的中心位置,那就太好了。 因此,您必须在一处重命名交换和/或路由密钥。 另一个优点是透明度 - 一个文本文件包含有关哪些服务依赖于哪些交易所的信息。

此类管理组件的配置可能如下所示:

services:
    service1: s1
        binding1:
            exchange: e1
            queue1: s1q1
            routing-key: rk1
        binding2:
            exchange: e1
            queue1: s1q2
            routing-key: rk2
        ...
    service2: s2
        binding1:
            exchange: e2
            queue1: s2q1
            routing-key: rk3
        binding2:
            exchange: e2
            queue1: s2q1
            routing-key: rk4
        ...
    ...

并且

service1
的配置可以只包含队列名称:

config:
    queue1: s1q1
    queue2: s1q2
...

服务将仅创建队列和管理组件 - 交换和绑定。

我正在考虑创建额外的服务,其唯一目的是创建绑定。 但我不确定我是否不会重新发明轮子。

有这样的实用程序(也许是 RabbitMQ 插件)可以解决这个问题吗?

spring-boot rabbitmq message-queue spring-amqp rabbitmq-exchange
1个回答
0
投票

这是应用于 EDA 的治理的一流示例。它避免了不受控制的意大利面条路由。服务应该简单地将消息馈送到该服务的输入队列中,然后将其处理的事件提升到其专用的输出队列。其事件从其私有输出队列(在企业周围公开)的路由不是单个服务关心的问题,也不应受其影响。这应该在声明性文件中单独和集中控制 - 一种 EDA 全局编排任务控制 (EventOrchestration.yml)。然后,发布自动化脚本会读取此配置,以配置消息代理的路由。 我是 RabbitMQ 的新手,也想要一个答案 - 今天才开始阅读。它可以通过 Azure 服务总线以及转发和过滤规则来完成。转发规则根据消息的标头或有效负载属性路由事件。但看起来 RabbitMQ 中也存在类似的东西,通过根据消息中的路由键在交换级别设置路由规则。

© www.soinside.com 2019 - 2024. All rights reserved.