MassTransit/RabbitMQ 发送与发布和故障<>问题

MassTransit/RabbitMQ Send vs Publish and Fault<> question

我有 2 个应用程序,分别称为 appA 和 appB。它们分别有一个aQueue和bQueue,这两个应用程序都有一个ReceiveEndpoint。两个应用程序在 RabbitMQ 上使用相同的主机。

appA 正在使用 bus.Send 方法将命令 CreateEntityCommand 发送到 appB,进入 bQueue。

在 appB 中,我有一个消费者使用 CreateEntityCommand。

** 到目前为止一切顺利 **

问题 #1: 如果我的 appB 消费者成功创建实体,我将发布 EntityCreatedEvent。我在 appA 中的 EntityCreatedEvent 消费者做对了,但事件也被添加到 bQueue_skipped,为什么?

问题 #2: 现在,如果我的 appB 消费者有异常,我的 appA 必须得到通知。在 bQueue 中生成 Fault。我希望我的 appA 消耗故障,但故障自动在 bQueue 上。如果我将 appA 中的 ReceiveEndpoint 添加到列出的 bQueue,我会得到很多 dead_letter(跳过的队列)。

根据经验,如果您的消息到达死信(已跳过)队列,则意味着消息类型交换和队列交换之间存在绑定,但您的端点没有消费者给定消息类型。

这通常发生在您曾经有一个消费者然后将其删除时。 MassTransit 不会为您删除绑定,但它也不知道如何处理不断到来的消息。

您可以通过转到 RMQ 管理 UI 执行以下操作来删除过时的绑定:

  • 打开端点队列
  • 点击绑定,那里只有一个,指向端点交换
  • 按照 link 打开端点交换并查看消息类型交换的绑定
  • 在那里,您可以删除那些不再需要的绑定

如果队列中没有消息,您也可以将其删除,MassTransit 将从头开始为您创建所有内容。