0

作为 RabbitMQ 的新手,我想知道如何处理离线目标节点。

作为一个例子,这个场景:

  • 1个日志记录应用程序,将日志存储到一些持久性存储中
  • N 个日志发布应用程序,希望通过日志记录服务器将其日志写入持久存储。

将有两种选择:

  1. 每个发布应用程序都将其日志消息发布到其本地 RabbitMQ 实例,并且日志记录服务器必须订阅其中的每一个
  2. 日志记录应用程序有它的本地 RabbitMQ 实例,每个日志发布应用程序都在该实例上传递它的消息。

选项 1 将要求我在每次出现或移动新应用程序时重新配置/重新编码/通知录制应用程序。因此,我认为选项 2 是正确的,每个新的发布应用程序都简单地写入记录应用程序的 RabbitMQ 节点。

我唯一苦苦挣扎的是如何处理录制应用程序的节点关闭的情况。我是否需要构建自己的系统来存储消息,直到它重新上线,或者我可以使用 RabbitMQ 的某些功能来处理它?即每个发布应用程序的本地RabbitMQ 是否可以在它重新上线后立即接收消息并将它们转发到记录应用程序RabbitMQ?

我发现有关 Federated 插件的某些内容无法理解是否是解决方案。也许我需要一些不同的东西,或者我必须编写自己的本地排队系统(我希望我不必这样做)来在目标节点离线时对消息进行排队。

任何指向架构示例或解决方案的链接都非常受欢迎。

顺便说一句:https : //groups.google.com/forum/#!topic/easynetq/nILIKSjxyMg 声明您不应该为每个应用程序安装 RabbitMQ 节点,所以也许我应该求助于 MSQM 或 ZeroMQ(?)

4

1 回答 1

1

根据听起来类似情况的经验,我建议在离线时使用队列以外的东西在本地存储消息。

几年前,我构建了一个必须离线工作的系统——根本没有网络连接——然后当笔记本电脑被带回办公室时,必须通过消息队列将消息推送到中央服务器。

当消息队列不可用时,我通过使用本地数据库(当时的 sqlite)来存储我的消息来解决这个问题。

你应该做类似的事情。当 RabbitMQ 离线时,使用本地数据库甚至纯文本文件或 CSV 文件来存储您的消息。当它重新连接时,从本地文件系统读取消息并通过 RabbitMQ 发送它们。

这是一个很好的使用策略,即使您不希望 RabbitMQ 离线。坦率地说,它会在某个时候离线,你将不得不处理它。您应该为这种情况做好准备,在本地存储您的消息将对此有所帮助。

...

关于每个应用程序的 rqm 节点:坏主意。这给您的系统增加了大量的复杂性。您需要尽可能少的 RabbitMQ 节点。意思是,在可能的情况下,每个系统(一个由许多应用程序组成的系统)1 个......除了 RabbitMQ 集群的可用性 - 但这完全是另一行问题和设计。

...

我对 Aria Stewart 进行了一次关于设计 RabbitMQ 和消息系统的失败的采访,并且有一小段摘录她谈到了网络是如何失败的。

关键是,网络或 RabbitMQ 或某些东西会出现故障,您将需要像本地数据存储这样的解决方案,以便在 RabbitMQ 重新联机时可以恢复。

于 2015-07-29T15:54:47.707 回答