【问题标题】:Durable vs. transient subscriptions持久订阅与临时订阅
【发布时间】:2017-11-08 17:01:03
【问题描述】:

我正在使用 RabbitMQ 和 MassTransit 使用 pub/sub 消息传递集成多个 .Net 模块。大多数消息订阅应该是持久的。但有些应该是暂时的。当消费者死亡时,不应存储消息,并且应丢弃已排队的消息。

在每个模块中,我创建了 1 个带有 2 个接收端点的总线。一种配置为持久且非自动删除。另一个配置为非持久和自动删除。每个都有自己的一组消费者。这按预期工作。

现在我正在尝试实现请求/响应消息。问题来了,因为现在发件人必须决定路由到哪个交换。这是错误的,因为我希望接收者决定是使用持久队列还是瞬态队列。

我的问题:

  1. 有没有更好的方法同时支持持久订阅和临时订阅?

  2. 为什么 MassTransit 将消息交换绑定到绑定到端点队列的端点交换?为什么消息交换不能直接绑定到端点队列?

  3. 让我们假设一个模块中的所有请求消费者都是持久的或瞬态的。是否可以声明一个“模块”交换,然后绑定到持久队列或瞬态队列?所以发送者寻址模块交换并且模块决定绑定到哪个队列。如何说服 MassTransit 这样做?

  4. 模块正在使用持久订阅,这些订阅在模块和代理重新启动后仍然有效。一段时间后,管理员(因此在系统的运行时)决定断开该模块与系统的连接。模块能否以某种方式取消订阅所有内容并让 MassTransit 移除持久交换和队列?

【问题讨论】:

    标签: rabbitmq masstransit


    【解决方案1】:

    您的问题以发送到未知端点的请求/响应开始,并以删除交换结束。我想这些是不同的东西。

    我无法逐条回答,只是想弄清楚。

    根据定义,请求/响应要求您知道将内容发送到哪里。根据 MassTransit 约定,端点地址始终是交换/队列对地址。因此,您不能让接收者决定谁来处理此消息,它将被传递到您将其发送到的端点的交换/队列。

    关于“取消订阅” - MassTransit 不会删除任何内容。您必须手动或使用管理 API 清理未使用的绑定。

    【讨论】:

    • 是的,我在那里放了很多东西。常见的主题是持久和临时订阅......我知道必须有一个已知的 req/res 地址。我只想将 1 个地址提供给发送者并让接收者决定它是排队到持久队列还是临时队列(我用图片更新了问题)。问题是我是否可以自定义 MT 来创建一个交换和两个队列?查看 MT 代码似乎我必须更改一半的端点创建代码,并且不确定它之后是否会工作。
    • 我实际上可以创建第三个端点。但它开始变得复杂,我怀疑有更好的方法我看不到。顺便说一句,取消订阅答案。完美回答第 4 题。
    • 每个接收端点是一个交换和一个具有端点名称的队列的组合。
    猜你喜欢
    • 2015-08-24
    • 2016-01-14
    • 2013-12-17
    • 2015-08-11
    • 2017-01-24
    • 2017-11-08
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    相关资源
    最近更新 更多