2

所以我打算编写一个适合生产者/消费者模式的应用程序。我当时正在考虑构建自己的生产者/消费者框架,但后来想到了我在工作中广泛使用的消息队列。考虑到我正在编写的应用程序的多个模块需要在单个服务器上作为该特定主机的客户端/控制器运行,我不能 100% 确定消息队列是否是正确的方法。

将消息队列用于非分布式应用程序的优缺点是什么?以前有人用过这种方式吗?

谢谢,如果您需要更多信息,请告诉我。

4

1 回答 1

1

“消息队列”是指外部消息服务器吗?我的以下答案假设这就是您所要求的。如果您只是询问更通用的架构方法,即通过内存消息而不是方法调用让模块部分或全部通信 - 是的,有时这可能非常好。像番石榴的 EvenBus 这样的类很好地促进了这样的设计:https ://code.google.com/p/guava-libraries/wiki/EventBusExplained

一方面,当一个简单的队列数据结构就足够时,我通常会阻止人们使用 JMS 消息队列。有时我觉得 JMS 是一种进程间通信工具,具有一对多(主题)和一对一的通信通道,恰好被命名为 queues。是的,它们的访问模式类似于队列,但在我看来,更重要的特征是它们的点对点消息传递能力。所以我认为一个不幸的名字有时会导致人们在他们只需要一把螺丝刀(java.lang.Queue)时使用手提钻(JMS)。

另一方面,任何规则都有例外。我不能直接推荐一个 java.lang.Queue 实现,它在服务器重启期间是线程安全的和持久的(人们考虑 JMS 时经常需要的特性)。我确定有一些。找到一些并将它们与 JMS 进行比较。权衡业务需求、时间限制、未来可能的设计/要求等。我之前自己实现了一个,结果非常好(并且比通过网络向远程 JMS 服务器发送消息要快)——但只有你可以说如果这适合您的情况。

我想您总是可以通过让您的应用程序的模块通过您自己的类似消息传递的接口进行通信来推迟决定,该接口目前在内部使用 java.lang.Queues,但如果您发现需要它,稍后会使用 JMS。尽管在这里也要小心——尽早添加不必要的抽象有时会成为不值得的负担。

于 2013-09-04T03:20:56.037 回答