2016-02-29 27 views
0

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

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

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

谢谢,迈克尔

回答

1

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

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

如果有许多应用程序正在生成事件,并且以后如果您希望scale out(或横向扩展)代理服务,因为它正在成为瓶颈,上述两个解决方案均提供集群服务。

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

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

我觉得排队的解决方案是在可维护性,参与的应用和性能的松耦合本质而言一个最好的办法。

相关问题