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

Posted

技术标签:

【中文标题】用于在两个进程之间共享数据的本地消息队列【英文标题】:Local message queue for sharing data between two processes 【发布时间】:2016-02-29 10:00:02 【问题描述】:

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

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

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

谢谢,米凯尔

【问题讨论】:

【参考方案1】:

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

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

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

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

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

我认为队列解决方案在可维护性、参与应用程序的松散耦合性质和性能方面是最佳方法。

【讨论】:

以上是关于用于在两个进程之间共享数据的本地消息队列的主要内容,如果未能解决你的问题,请参考以下文章

系统引入消息队列的思考

21消息队列

进程间通信—消息队列

8.7 进程间的通讯:管道消息队列共享内存信号量信号Socket

进程通信——管道消息队列共享内存信号量

管道通信为啥比共享内存效率低