0

有没有关于如何在微服务架构中组织 RabbitMQ 交换/队列的最佳实践?

假设我有服务 A、B、C、D。服务 D 需要使用来自 A 和 B 的事件,向 C 发布命令。

我的解决方案 - 每个服务都声明它的交换。交换 A、交换 B、交换 C、交换 D。

客户端可以向该交换发布命令并使用来自这些交换的事件。这些是主题交换,因此对于命令,路由键将是 ServiceA.Command.Command1,对于事件 ServiceA.Event.Event1。

对于我分享的示例:

ServiceD binds queue (with name ServiceD.ServiceA.Event.Queue) to ExchangeA with routing key: ServiceA.Event.#
ServiceD binds queue (with name ServiceD.ServiceB.Event.Queue) to ExchangeB with routing key: ServiceB.Event.#
ServiceD produces command to the exchange ServiceC with routing key ServiceC.Command.Command1

这是正确的方法吗?有什么好的例子我可以看看吗?

4

3 回答 3

2

Microsoft 示例微服务项目在这里:https ://github.com/dotnet-architecture/eShopOnContainers

通常使用一个 Exchange 和 N 个队列。

交换图像
队列图像

于 2021-03-13T18:17:00.903 回答
0

您可能只有一个交换,并且每个服务都从它们自己的队列中消费(每个主题服务 1 个队列)。所有服务都发布到同一个交易所。

按照你的例子:

  • ServiceD 使用路由键将队列(名称为 ServiceD.ServiceA.Event.Queue)绑定到 Exchange1:ServiceA.Event.#
  • ServiceD 使用路由键将队列(名称为 ServiceD.ServiceB.Event.Queue)绑定到 Exchange1:ServiceB.Event.#
  • ServiceD 使用路由密钥 ServiceC.Command.Command1 向 Exchange Exchange1 生成命令
  • ServiceC 使用路由键将队列(名称为 ServiceC.Commands.Queue)绑定到 Exchange1:ServiceC.Command.#
  • 等等

您还可以有多个交换,每个对象类型 1 个交换(例如,一个与客户对象事件和命令的交换,另一个与订单事件和命令的交换)。

于 2021-03-13T18:55:44.743 回答
0

您的 Exchange 不应基于服务,而应与需要异步处理消息的事务相关联。为这些交易创建交易所,并创建您的发布者并将其映射到这些交易所。创建消费者队列并将队列绑定到交换器。这将是您的其他服务从中提取消息进行处理的队列。您的一项服务可以进行 1:N 交换。

于 2021-03-12T22:06:41.250 回答