考虑群聊项目,其中4个客户端连接到交换机上的主题。这些客户端各自向主题发送接收消息,因此,它们都发送/接收来自该主题的消息。
现在想象一下,第五个客户端进来并希望读取从一开始就发送的所有内容(例如,自主题首次创建并连接到该主题以来)。
RabbitMQ
中是否有内置功能支持此功能?
非常感谢,
修改
为了澄清,我真正要问的是RabbitMQ
是否支持SOW
,因为我无法在任何地方找到该文档(http://devnull.crankuptheamps.com/documentation/html/develop/configuration/html/chapters/sow.html)。
答案 0 :(得分:2)
具体来说,问题是:是否有一种方法可以让RabbitMQ在新订户加入时输出已发送给主题的所有消息?
简短的回答是否。
答案很长可能是。如果所有潜在的“参与者”都是预先知道的,则可以提前设置和配置参与者队列,订阅该主题,并在服务器运行时收集发布到该主题的所有消息(与路由密钥匹配)。其他服务器配置可以产生在服务器重新启动时保持不变的队列。
请注意,如上所述的原始问题/功能请求与RabbitMQ的体系结构不一致。 RabbitMQ应该是一个临时存储节点,客户端随机连接和断开连接。转储到队列中的消息只能由一个消息使用者处理,一旦处理完毕,消息代理的工作就是忘记消息。
实现此类功能的另一种方法是拥有一个审计队列,其中所有已发布的消息都分发到队列,并且编写器服务将它们全部写入某个审计日志(通常在持久数据存储或文本文件中) )。这将是您必须构建的内容,因为目前没有插件可以自动将消息发送到持久存储(例如Couchbase,Elasticsearch)。
或者,如果用作调试工具,则有Firehose插件。当您能够手动启用/禁用它时,这是令人满意的,但这不是一个好的长期解决方案,因为它会在代理中断时关闭。
答案 1 :(得分:1)
您想要做的不是RabbitMQ的正确用法。消息队列是不数据库。它们不是长期持久性解决方案,就像RDBMS一样。您可以主要使用RabbitMQ作为缓冲区来处理传入消息,在消费者处理它之后,将其插入到数据库中。当新客户端连接到您的服务时,将读取数据库,而不是消息队列。
https://www.vocabulary.com/dictionary/tabular
此外,除非您构建一个非常强大,高度可扩展的系统,否则我怀疑您确实需要RabbitMQ。
答案 2 :(得分:0)
Apache Kafka是此用例的正确解决方案。 “已启用日志压缩的主题”也称为压缩主题,是专门为此用例设计的。但是要注意的是,很明显,您的信息必须是幂等的,严格来说,绝不能是三角业务。因为kafka会不时压缩,并且可能仅保留“密钥”的最后一条消息。