Java 何时、何地及;如何使用队列?

Java 何时、何地及;如何使用队列?,java,queue,Java,Queue,我是企业Java开发新手,尽管我确信这个问题同样适用于任何语言或平台,如.NET 这是我第一次处理消息队列,我对它们非常感兴趣。(具体来说,我们使用的是ActiveMQ)。我的技术负责人希望ActiveMQ队列成为我们所有数据库和内部web服务的领跑者;因此,不是从客户机启动数据库查询并直接进入数据库,而是首先排队 我的问题是:队列是否是每个主要处理组件的必经之路?最佳实践是否要求将它们放在通常会被大量请求击中的系统组件前面?是否存在不应使用队列的情况 谢谢你的洞察力 请查看以下内容: 解决这

我是企业Java开发新手,尽管我确信这个问题同样适用于任何语言或平台,如.NET

这是我第一次处理消息队列,我对它们非常感兴趣。(具体来说,我们使用的是ActiveMQ)。我的技术负责人希望ActiveMQ队列成为我们所有数据库和内部web服务的领跑者;因此,不是从客户机启动数据库查询并直接进入数据库,而是首先排队

我的问题是:队列是否是每个主要处理组件的必经之路?最佳实践是否要求将它们放在通常会被大量请求击中的系统组件前面?是否存在不应使用队列的情况

谢谢你的洞察力

请查看以下内容:

解决这类问题的不仅仅是野外的队列。


回答你的问题。在这种情况下,队列将在访问数据库时引入异步行为。在这种情况下,更多的问题是您是否能够承受对遗留系统的巨大影响。要把所有的事情都推到队列中,可能会有太多的变化。请描述您的系统的一般用途。这样就更容易完整地回答您的问题。

下面是一些消息队列可能有用的示例

有限的资源
假设有大量用户向服务发出请求。如果服务只能同时处理少量请求,则可以使用队列作为缓冲区

服务解耦
一个关键的企业集成概念是工作流中系统的解耦。它们不让系统直接相互通信,而是异步地将消息发布到队列。然后,集成组件将消息路由并传递到适当的系统

消息重播
在上面的示例中,队列还可以提供请求的可靠传递和处理。如果工作流的一个组件出现故障,其他组件将不受影响,并且仍然可以操作并向故障组件发布消息。当断开的组件恢复时,它可以处理所有排队的消息

这里的关键概念是负载调节、松耦合、可靠性和异步操作


至于它们是否是每一个主要组件的出路,我会说不,这不是一个自动的选择,你必须单独考虑每个组件。

队列确实是一个非常强大和有用的工具,但是像每个工具一样,你应该只使用它来做它想要的工作。 在我看来,他们不是每个主要处理组件的首选对象

作为一般规则,我将使用一个队列,其中请求资源不需要立即同步响应。在处理的及时性和顺序至关重要的情况下,我不会使用队列

如果允许异步处理,并且您希望调节服务的通信量,那么队列可能是一种方法


参见@Qwerky的答案,他(或她)提出了一些好的观点。

消息队列基本上是一个异步通信系统。在这种情况下,这意味着除了连接发送方和接收方的队列之外,发送方和接收方都独立运行;消息的接收者不需要(也不应该)与发送者进行交互。类似地,消息的发送者不(也不应该)需要与接收者交互

如果发送方需要等待处理消息的结果,那么消息队列可能不是一个好的解决方案,因为这将迫使异步系统与核心设计保持同步。在消息队列之上构建一个同步通信系统是可能的,但是消息队列的基本异步特性会使这种转换变得笨拙