MassTransit:多个使用者、单独的队列/端点、消息未传递



我设置了 2 个服务来接收相同的消息,例如ConsumerA : IConsumer<IMessageA>ConsumerB : IConsumer<IMessageA>.每个服务都设置一个唯一的端点,例如queue_aqueue_b并注册其消费者。我在 RabbitMQ 中看到一个 IMessageA 的交换,该交换类型为扇出并绑定到queue_aqueue_b。目前为止,一切都好。

  • 我运行两个服务并发布消息,但只有服务 A 才能获得它。
  • 我停止服务 A 并在 RabbitMQ 中手动向 B 发布消息(服务 A 是一个 Web 服务,它发布IMessageA以响应使用IRequestClient<IMessageA, IMessageAResponse>的 POST,这就是为什么我需要手动发布),现在服务 B 获取消息并按预期使用它。

需要明确的是,在服务 A 停止的情况下,RabbitMQ 将消息路由到queue_aqueue_b。如果服务 A 正在运行,则消息只会发送到queue_b,尽管存在交换绑定,表明queue_b绑定到IMessageA交换,并且绝对应该获取它们。或者至少当我能够通过管理 Web UI 检查 RabbitMQ 时,没有证据表明曾经有过向queue_b传递消息(即queue_b_errorqueue_b_skipped中没有任何消息,后者甚至不存在)。

我已经向服务 A 和 B 添加了IReceiveObserver,但没有任何内容触发ReceiveFaultConsumeFault

服务 A 中的使用者基本上在做:

var result = await MethodThatReturnsIMessageAResponse(messageA);
context.Respond(result);

为什么服务 A 会干扰向服务 B 传递消息?我什至从哪里开始寻找?

问题是我使用以下方法"发布"消息:

c.Resolve<IBus>().CreateRequestClient<IToDoMessage, IToDoMessageResponse>(new Uri(QueueAddress + QueueName),TimeSpan.FromSeconds(5));

这需要特定的点(例如队列名称)。相反,我需要使用CreatePublishRequestClient

c.Resolve<IBus>().CreatePublishRequestClient<IToDoMessage, IToDoMessageResponse>(TimeSpan.FromSeconds(5));

它使用总线发布,并通过交换,而不是到特定的队列。GitHub 示例项目显示前者无济于事......

最新更新