在一个请求中读取队列中所有消息的机制
Mechanism for reading all messages from a queue in one request
我需要一个类似于队列的以下场景的解决方案:
我想连续向队列写入消息。我的消息非常大,包含大量数据,所以我确实希望发出尽可能少的请求。
所以我的队列在某个时候会包含很多消息。
我的消费者将每 1 小时从队列中读取一次。 (不是每当写入新消息时)并且它将读取队列中的所有消息。
问题是我需要一种方法来仅使用一个调用从队列中读取所有消息(我还希望消费者对队列发出尽可能少的请求)。
一个接近的解决方案是 ActiveMQ,但问题是您一次只能读取一条消息,而我需要在一个请求中读取所有消息。
所以我的问题是..还有其他方法可以更有效地做到这一点吗?我真正需要的是以某种方式保存由某个应用程序连续创建的消息,然后每 1 小时一次由同一个应用程序使用它们(也删除它们)。
我认为队列适合的原因是,当消息被使用时,它们也会被删除,但我需要一次使用它们。
我认为在寻找解决方案时需要牢记一些重要事项:
- 您需要以什么方式"more efficient"(例如时间、货币成本、计算资源等)?
- 很难证明实际上没有其他 "more efficient" 方法可以解决特定问题,因为这需要测试所有可能的解决方案。您真正需要知道的是,根据您的特定用例,哪种解决方案足够好。当然,这需要具体了解您需要什么样的性能数据以及获取这些数据的限制条件(例如时间、货币成本、计算资源等)。
- 现代消息代理客户端(例如随附 ActiveMQ 5.x 或 ActiveMQ Artemis 的客户端)不会为它们使用的每条消息进行网络往返,因为那样效率极低。相反,它们获取可配置大小的消息块(例如
prefetchSize
用于 ActiveMQ 5.x,consumerWindowSize
用于 ActiveMQ Artemis)。这些消息本地存储在某种缓冲区中,并在进行相关 API 调用以接收消息时馈送到客户端应用程序。
- 制作"as few requests as possible"很少是提高性能的方法。现代消息代理可以很好地适应并发消费者。与旋转多个线程(每个线程都有自己的消费者)相比,使用单个消费者消费所有消息极大地限制了消息吞吐量。与其限制消费者请求的数量,您几乎肯定应该最大化它们,直到达到递减点 returns.
我需要一个类似于队列的以下场景的解决方案:
我想连续向队列写入消息。我的消息非常大,包含大量数据,所以我确实希望发出尽可能少的请求。 所以我的队列在某个时候会包含很多消息。 我的消费者将每 1 小时从队列中读取一次。 (不是每当写入新消息时)并且它将读取队列中的所有消息。
问题是我需要一种方法来仅使用一个调用从队列中读取所有消息(我还希望消费者对队列发出尽可能少的请求)。
一个接近的解决方案是 ActiveMQ,但问题是您一次只能读取一条消息,而我需要在一个请求中读取所有消息。
所以我的问题是..还有其他方法可以更有效地做到这一点吗?我真正需要的是以某种方式保存由某个应用程序连续创建的消息,然后每 1 小时一次由同一个应用程序使用它们(也删除它们)。
我认为队列适合的原因是,当消息被使用时,它们也会被删除,但我需要一次使用它们。
我认为在寻找解决方案时需要牢记一些重要事项:
- 您需要以什么方式"more efficient"(例如时间、货币成本、计算资源等)?
- 很难证明实际上没有其他 "more efficient" 方法可以解决特定问题,因为这需要测试所有可能的解决方案。您真正需要知道的是,根据您的特定用例,哪种解决方案足够好。当然,这需要具体了解您需要什么样的性能数据以及获取这些数据的限制条件(例如时间、货币成本、计算资源等)。
- 现代消息代理客户端(例如随附 ActiveMQ 5.x 或 ActiveMQ Artemis 的客户端)不会为它们使用的每条消息进行网络往返,因为那样效率极低。相反,它们获取可配置大小的消息块(例如
prefetchSize
用于 ActiveMQ 5.x,consumerWindowSize
用于 ActiveMQ Artemis)。这些消息本地存储在某种缓冲区中,并在进行相关 API 调用以接收消息时馈送到客户端应用程序。 - 制作"as few requests as possible"很少是提高性能的方法。现代消息代理可以很好地适应并发消费者。与旋转多个线程(每个线程都有自己的消费者)相比,使用单个消费者消费所有消息极大地限制了消息吞吐量。与其限制消费者请求的数量,您几乎肯定应该最大化它们,直到达到递减点 returns.