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

eufgjt7s  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(522)

我需要一个类似于队列的解决方案:
我想连续地将消息写入队列。我的消息非常大,包含了大量的数据,所以我希望尽可能少的请求。所以我的队列在某个时候会包含很多消息。我的消费者将每1小时从队列中读取一次(它将读取队列中的所有消息。
问题是,我需要一种只使用一个调用读取队列中所有消息的方法(我还希望使用者向队列发出尽可能少的请求)。
接近的解决方案是activemq,但问题是一次只能读取一条消息,我需要在一个请求中读取所有消息。
所以我的问题是。。有没有其他更有效的方法?实际上,我需要的是以某种方式持久化由某个应用程序连续创建的消息,然后每1小时由同一个应用程序一次使用它们(也删除它们)。
我认为队列适合的原因是,当消息被消费时,它们也会被删除,但我需要一次消费所有消息。

a2mppw5e

a2mppw5e1#

我认为,在寻找解决方案时,有一些重要的事情需要牢记:
你需要以什么方式“更有效率”(例如时间、金钱成本、计算资源等)?
事实上,要证明没有其他“更有效”的方法来解决一个特定的问题是非常困难的,因为这需要一个人去测试所有可能的解决方案。您真正需要知道的是,考虑到您的特定用例,什么样的解决方案足够好。当然,这需要明确知道您需要什么样的性能数字以及获取这些数字的限制条件(例如,时间、货币成本、计算资源等)。
现代的MessageBroker客户端(例如,随activemq 5.x或activemq artemis一起提供的那些客户端)不会为它们使用的每个消息进行网络往返,因为这样会非常低效。相反,它们获取可配置大小的消息块(例如。 prefetchSize 对于activemq 5.x,以及 consumerWindowSize 用于activemq artemis)。这些消息本地存储在一个排序缓冲区中,并在相关api调用接收消息时提供给客户机应用程序。
提出“尽可能少的请求”很少是提高性能的方法。现代消息代理可以很好地与并发用户进行扩展。与旋转多个线程(每个线程都有自己的使用者)相比,使用单个使用者消耗所有消息会极大地限制消息吞吐量。与其限制消费者请求的数量,你几乎可以肯定的是,你应该最大限度地提高它们,直到你达到一个回报递减的点。

相关问题