在一个请求中从队列读取所有消息的机制

时间:2018-12-06 14:01:08

标签: java queue activemq message-queue producer-consumer

对于以下与队列类似的情况,我需要一个解决方案:

我想将消息连续写到队列中。我的邮件非常大,包含大量数据,因此我确实希望发出尽可能少的请求。 因此,我的队列有时会包含很多消息。 我的消费者每隔1小时就会从队列中读取一次。 (并非在写入新消息时),它将从队列中读取所有消息。

问题是我需要一种方法,仅使用一个调用即可读取队列中的所有消息(我还希望使用者对队列的请求尽可能少)。

ActiveMQ是一个紧密的解决方案,但问题是您一次只能读取一条消息,而我需要在一个请求中全部读取它们。

所以我的问题是。还有其他方法可以更有效地做到这一点吗?我需要做的实际事情是以某种方式持久保存某些应用程序连续创建的消息,然后每隔1小时一次将同一应用程序使用它们(也将它们删除)。

我认为适合队列的原因是因为消息被消耗后,它们也被删除了,但我需要立即消耗掉它们。

1 个答案:

答案 0 :(得分:0)

我认为您在寻找解决方案时要牢记一些重要的事情:

  1. 您需要以哪种方式“提高效率”(例如时间,金钱成本,计算资源等)?
  2. 很难证明实际上没有其他“更有效”的方法可以解决特定问题,因为这将需要一种方法来测试所有可能的解决方案。根据您的特定用例,您真正需要知道的是足够好的解决方案。当然,这需要特别了解您需要哪种性能数字以及获取这些数字的限制(例如时间,金钱成本,计算资源等)。
  3. 现代的消息代理客户端(例如,ActiveMQ 5.x或ActiveMQ Artemis附带的代理)不会针对它们消耗的每条消息进行网络往返,因为这样做效率极低。相反,它们以可配置的大小来获取消息块(例如,对于ActiveMQ 5.x,为prefetchSize,对于ActiveMQ Artemis,为consumerWindowSize)。这些消息存储在本地的各种缓冲区中,并在进行相关的API调用以接收消息时馈送到客户端应用程序。
  4. 发出“尽可能少的请求”很少是提高性能的一种方法。现代消息经纪人可以与并发消费者很好地进行扩展。与拆分每个都有自己的使用者的多个线程相比,使用单个使用者使用所有消息将极大地限制消息吞吐量。除了限制消费者请求的数量之外,几乎可以肯定的是,应该使它们最大化,直到达到收益递减的程度。