用于在两个进程之间共享数据的本地消息队列

时间:2016-02-29 10:00:03

标签: java ipc message-queue

我有一个服务器应用程序A,它在请求到达时生成记录。我希望这些记录保存在数据库中。但是,我不想让应用程序A线程花时间通过直接与数据库通信来持久保存记录。因此,我考虑使用简单的生产者 - 消费者体系结构,其中应用程序A线程生成记录,而另一个应用程序B线程是将记录持久保存到数据库的消费者。

我正在寻找在应用程序A和B之间共享这些记录的“最佳”方式。一个重要的要求是应用程序A线程总是能够将记录发送到IPC系统(例如队列,但可能是一些其他解决方案)。因此,我认为记录必须始终存储在本地,以便应用程序A线程能够在网络关闭时发送记录事件。

我想到的最初想法是使用本地消息队列(例如ActiveMQ)。您认为本地消息队列是否合适?如果是,您是否建议实施特定的消息队列?请注意,这两个应用程序都是用Java编写的。

谢谢,Mickael

1 个答案:

答案 0 :(得分:1)

对于这种类型的需求,排队解决方案似乎是最合适的,因为事件的生产者和消费者可以孤立地工作。有很多解决方案,我亲自与RabbitMQ和ActiveMQ合作。两者都同样好。我不想在这里比较它们的性能特征,但是RabbitMQ是用Erlang编写的,它是用于构建实时应用程序的语言编写者。

由于您已经在Java平台上,因此ActiveMQ可能是更好的选择,并且能够产生高吞吐量。通过这样的解决方案,消费者不必一直在线。根据您的事件数据的重要程度,您可能还希望拥有持久性队列和消息,以便在消息代理失败时,您仍然可以恢复重要的事件"应用程序A生成的消息。

如果有许多应用程序生成事件,如果您希望scale out(或横向扩展)代理服务,因为它会遇到瓶颈,上述两种解决方案都会提供集群服务。

最后但并非最不重要的一点是,如果您想在不同平台之间共享这些事件,您可能希望以AMQP格式共享消息,这是一种独立于平台的有线协议,用于在异构系统之间共享消息,以及我不确定这是否是你的要求。 RabbitMQ和ActiveMQ都支持AMQP。这两个解决方案都支持MQTT这是一个轻量级的消息传递协议,但似乎你不希望使用MQTT。

还有其他产品,例如HornetQApache Qpid,这些产品也是生产就绪解决方案,但我没有亲自使用过它们。

我认为排队解决方案在可维护性,参与应用程序的松耦合性和性能方面是最好的方法。