【问题标题】:When, where & how should queues be used?何时、何地以及如何使用队列?
【发布时间】:2011-11-17 20:46:23
【问题描述】:

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

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

我的问题是:队列是每个主要处理组件的方式吗?最佳实践是否要求将它们放在通常会受到大量请求的系统组件的前面?是否存在不应该使用队列的情况?

感谢您在这里提供任何见解!

【问题讨论】:

    标签: java queue


    【解决方案1】:

    请查看:

    http://code.google.com/p/disruptor/

    解决这类问题不仅需要排队。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

        【解决方案3】:

        队列确实是一个非常强大和有用的工具,但就像每个工具一样,您应该只将它用于预期的工作。

        IMO 他们不是每个主要处理组件都可以使用。

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

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

        也请参阅@Qwerky 的回答,他(或她)提出了一些好观点。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 2020-05-05
            • 1970-01-01
            • 2018-12-28
            • 2014-12-28
            • 2023-03-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-01
            相关资源
            最近更新 更多