什么开源消息队列软件提供了严格排序的持久性?

Posted

技术标签:

【中文标题】什么开源消息队列软件提供了严格排序的持久性?【英文标题】:What open source message queuing software provides durability with strict ordering? 【发布时间】:2011-09-16 04:27:57 【问题描述】:

我们需要的是 RabbitMQ,它实际上是一个队列 @9​​87654321@。消息应该保留在队列的头部,直到客户端明确地将它们出列。

这似乎是一个非常简单的场景,但由于某种原因,我找不到任何代理来支持它。代理应该在 Windows 操作系统上运行。

【问题讨论】:

你真正的业务/应用场景是什么? WCF 也可以配置为使用队列。 你的链接好像坏了,你指的是什么? 【参考方案1】:

如果只有一条消息是问题所在,为什么不在处理消息之前将其写入文件(并刷新文件)。确认消息后,删除文件。

如果您担心消息代理崩溃,第一步是将其升级到在 Erlang R14B02 上运行的 RabbitMQ 2.4.1。第二步是对它进行集群化,以便您有多个服务器充当 MQ 代理。然后,更改您的应用程序以通过时间戳或通过保存消息 ID 来跟踪已处理的消息。然后,如果 RabbitMQ 重新排队一条消息,您将已经拥有它并将处理它并记住它。当它第二次出现时,您将忽略它。

您可能需要将 prefetch 设置为 0 才能正常工作。

还有另一种选择。您可以考虑编写自己的 RabbitMQ 插件来提供您需要的确切行为。 Erlang 乍一看可能看起来很复杂,但对于已经学习过几种语言的经验丰富的程序员来说,学习它真的不难。特别是,如果您有任何人在 Haskell 或 CAML 等语言方面具有函数式编程经验,他们会很快掌握足够的 Erlang 来完成这项工作。

由于 Erlang 的消息传递过程的内部模型,RabbitMQ 插件基本上可以做任何他们想做的事情。他们不需要遵守特定的受限插件 API。

换句话说,如果 RabbitMQ 只完成了您需要的 99%,请认为自己很幸运,只需少量工作,您就可以利用这 99% 并实现所需的一切。但是为了做到这一点,您必须摆脱 RabbitMQ 是您使用系统的软件包安装工具安装的另一个软件包的想法。在像你这样的情况下,RabbitMQ 应该被认为是一个关键任务工具,你应该从源代码安装 Erlang 和 RabbitMQ,并根据你的需要配置它们,而不会让你的操作系统限制你。

【讨论】:

【参考方案2】:

Apache Qpid 可能是您的最佳选择。在所有的消息队列中,这个队列有很多有趣的地方,包括strict ordering。

【讨论】:

【参考方案3】:

RabbitMQ 还支持strict ordering as of release 2.7.0,因此应该再次成为您的方案的一个选项。

【讨论】:

以上是关于什么开源消息队列软件提供了严格排序的持久性?的主要内容,如果未能解决你的问题,请参考以下文章

使用消息队列的优点

深入浅出 RabbitMQ

消息队列(mq)是啥?

使用 KahaDB 时如何持久化 Activemq 队列/主题中的消息?

ZWave 中的消息队列机制

消息队列何时提供NodeJS的支持