Rebus 和 RabbitMQ、non-durable 消息和 request-reply 对等点的理想设置

Ideal setup for Rebus and RabbitMQ, non-durable messages, and request-reply peers

我正在探索结合使用 Rebus 和 RabbitMQ 来涵盖几个不同的场景。

场景A 我希望能够有一个中央服务器将通知推送到任意订阅者列表,但消息不需要持久或持久。如果订阅者已连接,他们应该会收到通知,但如果他们断开连接,则无需 queue 向任何客户端发送消息。

到目前为止,在我的测试中,我能够让生产者和消费者与 UseRabbitMqInOneWayMode()ManageSubscriptions() 进行通信,但是,当没有订阅者时,消息会在 RabbitMQ 中累积,或者如果订户断开连接。我已经尝试将 header 设置为 false for RabbitMqMessageQueue.InternalHeaders.MessageDurability,但它没有效果。我怀疑这是因为 Rebus 设置的默认 queue 是持久的。 Rebus 有没有办法控制这种行为?

场景 B 当客户端上线或断开连接时,我想在客户端之间设置一个 request/reply 通道。例如:

  1. 客户端A和客户端B连接
  2. 客户端A 将发送一条消息,请求只有客户端B 拥有的数据。客户端 B 收集信息,并回复给 A。
  3. 客户端 B 断开连接
  4. 客户端 A 向客户端 B 请求数据,并且应该收到一个错误,因为 B 不再可用。

这种情况的推荐配置是什么?

谢谢。

我不是 RabbitMQ 方面的专家,因此对 RabbitMQ 的 Rebus 支持主要来自社区贡献。

我认为场景 A 可以通过使用 "auto-delete queues" 的 RabbitMQ 概念很容易地解决,您可以像这样使用 Rebus 配置它:

Configure.With(...) .Transport(t => t.UseRabbitMq(...) .ManageSubscriptions() .AutoDeleteInputQueue()) .(..)

这会导致 RabbitMQ 在最后一个订阅者断开连接时删除队列。

在方案 B 中,我觉得你最好使用同步通信的东西,因为那是你真正想要的。我建议您使用 HTTP,因为它非常擅长 request/reply :)