4

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

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

4

3 回答 3

2

从 2.7.0 版开始, RabbitMQ 还支持严格排序,因此应该再次成为您场景的一个选项。

于 2012-02-27T15:27:55.807 回答
2

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

如果您担心消息代理崩溃,第一步是将其升级到在 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,并根据你的需要配置它们,而不会让你的操作系统限制你。

于 2011-06-17T02:48:28.853 回答
2

Apache Qpid可能是您最好的选择。在所有的消息队列中,这个队列有很多有趣的地方,包括严格的排序

于 2011-06-17T11:37:14.503 回答