【问题标题】:Read all messages from the very begining从头开始阅读所有消息
【发布时间】:2020-08-05 01:06:37
【问题描述】:

考虑一个群聊场景,其中 4 个客户端连接到交换中的一个主题。这些客户端每个都向该主题发送一条接收消息,因此,它们都发送/接收来自该主题的消息。

现在假设有第 5 个客户端进来并想要读取从一开始发送的所有内容(例如,自从主题首次创建并连接到该主题时)。

RabbitMQ 中是否有内置功能支持此功能?

非常感谢,

编辑:

为了澄清,我真正要问的是RabbitMQ 是否支持SOW,因为我无法在任何地方的文档中找到它 (http://devnull.crankuptheamps.com/documentation/html/develop/configuration/html/chapters/sow.html)。

【问题讨论】:

    标签: rabbitmq


    【解决方案1】:

    具体来说,问题是:有没有办法让 RabbitMQ 在新订阅者加入时输出所有已发送到主题的消息?

    简短的回答是否。

    长答案是也许。如果预先知道所有潜在的“参与者”,则可以提前设置和配置参与者队列,订阅主题,并在服务器运行时收集发布到主题的所有消息(匹配路由键)。额外的服务器配置可以产生在服务器重新启动后持续存在的队列。

    请注意,所描述的原始问题/功能请求与 RabbitMQ 的架构不一致。 RabbitMQ 应该是一个临时存储节点,客户端随机连接和断开连接。转储到队列中的消息旨在仅由一个消息使用者处理,一旦处理完毕,消息代理的工作就是忘记该消息。

    实现此类功能的另一种方法是使用审核队列,其中所有已发布的消息都分发到队列中,写入器服务将它们全部写入某处的审核日志(通常在持久数据存储或文本文件中) )。这将是您必须构建的东西,因为目前没有插件可以自动将消息发送到持久存储(例如CouchbaseElasticsearch)。

    或者,如果用作调试工具,还有Firehose 插件。当您能够手动启用/禁用它时,这是令人满意的,但不是一个好的长期解决方案,因为它会在任何代理中断时自行关闭。

    【讨论】:

    • 谢谢!我确实找到了这个插件(github.com/rabbitmq/rabbitmq-recent-history-exchange),它或多或少地完成了我在这里提出的要求,但并不完全符合我的预期。这个问题更像是一个理论问题,因为我想知道RabbitMQ 是否支持SOW 查询,显然它不支持。许多高级队列(大多数不是免费的)支持此功能,它非常有用,因为您不必依赖其他机制在临时队列中存储临时数据,但这不是重点。非常感谢您的回复。这很有帮助。
    • 很高兴我能帮上忙!关于您评论的第二部分 - 添加产品来处理这种情况将是相当微不足道的。我不得不相信它比买东西更划算,尤其是因为大多数付费消息代理的性能比 RMQ 差得多。
    【解决方案2】:

    您想要做的不是 RabbitMQ 的正确用法。消息队列不是数据库。它们不是像 RDBMS 那样的长期持久性解决方案。您可以主要使用 RabbitMQ 作为 缓冲区 来处理传入的消息,在消费者处理它之后,将其插入到数据库中。当新客户端连接到您的服务时,将读取数据库,而不是消息队列。

    Relevant

    另外,除非你正在构建一个非常大、高度可扩展的系统,否则我怀疑你是否真的需要 RabbitMQ。

    【讨论】:

    • 恕我直言,这是不正确的。许多队列实现都支持 SOW(参见 devnull.crankuptheamps.com/documentation/html/develop/… 作为示例)。我在问兔子是否实现了这样的功能,因为我在文档中找不到任何东西。
    • 我对SOW了解不多,但我认为没有多少MQ实现它。通常,它们不用作数据库,我们有 RDBS。我建议你在这里使用 RabbitMQ 的邮件列表:rabbitmq.com/contact.html
    【解决方案3】:

    Apache Kafka 是此用例的正确解决方案。 “启用日志压缩的主题”又名压缩主题是专门为此用例设计的。但问题是,显然你的消息必须是幂等的,严格来说没有增量业务。因为kafka会时不时的compact,可能只保留一个“key”的最后一条消息。

    【讨论】:

      猜你喜欢
      • 2011-02-26
      • 2018-07-12
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      • 2017-08-21
      • 2017-03-14
      • 1970-01-01
      • 2018-09-24
      相关资源
      最近更新 更多