rabbitmq - 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(跳过队列)。
解决方案
根据经验,如果您的消息到达死信(跳过)队列,则意味着消息类型交换和队列交换之间存在绑定,但您的端点没有给定消息类型的消费者。
它通常发生在您曾经拥有一个消费者然后将其删除时。MassTransit 不会为您删除绑定,但它也不知道如何处理不断出现的消息。
您可以通过转到 RMQ 管理 UI 执行以下操作来删除过时的绑定:
- 打开端点队列
- 点击绑定,那里只有一个,指向端点交换
- 按照链接打开端点交换并查看与消息类型交换的绑定
- 在那里,您可以删除那些不再需要的绑定
如果队列中没有消息,您也可以将其删除,MassTransit 将从头开始为您创建所有内容。
推荐阅读
- android - java.lang.RuntimeException: 添加窗口失败请给我解决方案
- guava - Guava 将 HashBasedTable 转换为 TreeBasedTable
- android - 如何从 Firebase 获取所有日期并在日历中标记日期
- html - 为什么“宽度 100% 和高度:100%”不起作用
- javascript - 父元素隐藏溢出时的CSS位置问题
- javascript - 为什么 BeautifulSoup 不解析页面的所有元素?
- python - 重写从原始类型继承的python类中的构造函数
- javascript - 如何自动将数据添加到 html 中的表中?
- node.js - 如何使用 Promises 在循环中调用inquirer.js 菜单?
- r - ggplot:创建比例线图