首页 > 解决方案 > MassTransit/RabbitMQ 发送与发布和故障<> 问题

问题描述

我有 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 中生成了一个故障。我希望我的 appA 使用故障,但故障自动在 bQueue 上。如果我将 appA 中的 ReceiveEndpoint 添加到列出的 bQueue 中,我会得到很多 dead_letter(跳过队列)。

标签: rabbitmqmasstransit

解决方案


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

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

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

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

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


推荐阅读