我设置了 2 个服务来接收相同的消息,例如ConsumerA : IConsumer<IMessageA>
和ConsumerB : IConsumer<IMessageA>
.每个服务都设置一个唯一的端点,例如queue_a
、queue_b
并注册其消费者。我在 RabbitMQ 中看到一个 IMessageA 的交换,该交换类型为扇出并绑定到queue_a
和queue_b
。目前为止,一切都好。
- 我运行两个服务并发布消息,但只有服务 A 才能获得它。
- 我停止服务 A 并在 RabbitMQ 中手动向 B 发布消息(服务 A 是一个 Web 服务,它发布
IMessageA
以响应使用IRequestClient<IMessageA, IMessageAResponse>
的 POST,这就是为什么我需要手动发布),现在服务 B 获取消息并按预期使用它。
需要明确的是,在服务 A 停止的情况下,RabbitMQ 将消息路由到queue_a
和queue_b
。如果服务 A 正在运行,则消息只会发送到queue_b
,尽管存在交换绑定,表明queue_b
绑定到IMessageA
交换,并且绝对应该获取它们。或者至少当我能够通过管理 Web UI 检查 RabbitMQ 时,没有证据表明曾经有过向queue_b
传递消息(即queue_b_error
或queue_b_skipped
中没有任何消息,后者甚至不存在)。
我已经向服务 A 和 B 添加了IReceiveObserver
,但没有任何内容触发ReceiveFault
或ConsumeFault
。
服务 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 示例项目显示前者无济于事......