JMS队列满了怎么处理?
How to handle situation when JMS queue becomes full?
我已经创建了一个队列。生产者持续发布到 JMS 队列。但是,消费者需要一些时间来处理消息,一段时间后队列就满了。
如何在生产者端(Java 应用程序)和 JMS 代理端处理这种情况?
这是消息传递中的经典问题。
消息生产可以超过消息消费一段时间,但消费最终必须赶上来,在大多数情况下越快越好。在此期间,代理将充当存储消息的缓冲区,但像 ActiveMQ 这样的传统消息代理并非旨在 store 大量数据(例如数据库)。它们设计用于 流经 的大量数据,而内存和磁盘中存储的数据相对较少。
最重要的是,如果队列变“满”,那么您要么必须减慢(或可能停止)消息生成,直到消费者可以赶上并清除队列中的 space 或者 你需要加快消费者的速度(例如通过增加消费者的数量)。生产和消费是等式的两个方面,或多或少需要保持平衡。
就其价值而言,许多协议(例如 AMQP)和客户端实现提供自动 流控制 以在必要时减慢(或停止)生产者。查看您经纪人的文档以了解配置详细信息。
如果您发现您的用例不允许您执行这些操作中的任何一项,那么您可能不应该使用消息代理,而应该改用类似于数据库之类的旨在仅存储数据的东西。
我已经创建了一个队列。生产者持续发布到 JMS 队列。但是,消费者需要一些时间来处理消息,一段时间后队列就满了。
如何在生产者端(Java 应用程序)和 JMS 代理端处理这种情况?
这是消息传递中的经典问题。
消息生产可以超过消息消费一段时间,但消费最终必须赶上来,在大多数情况下越快越好。在此期间,代理将充当存储消息的缓冲区,但像 ActiveMQ 这样的传统消息代理并非旨在 store 大量数据(例如数据库)。它们设计用于 流经 的大量数据,而内存和磁盘中存储的数据相对较少。
最重要的是,如果队列变“满”,那么您要么必须减慢(或可能停止)消息生成,直到消费者可以赶上并清除队列中的 space 或者 你需要加快消费者的速度(例如通过增加消费者的数量)。生产和消费是等式的两个方面,或多或少需要保持平衡。
就其价值而言,许多协议(例如 AMQP)和客户端实现提供自动 流控制 以在必要时减慢(或停止)生产者。查看您经纪人的文档以了解配置详细信息。
如果您发现您的用例不允许您执行这些操作中的任何一项,那么您可能不应该使用消息代理,而应该改用类似于数据库之类的旨在仅存储数据的东西。