如果其中一个代理实例发生故障,ActiveMQ 中的故障转移传输会很好地工作 - 生产者会自动切换到下一个好的代理实例。
如果代理达到其内存限制(通过 activemq.xml 中的 systemUsage
属性配置),我预计会出现相同的行为。然而在这种情况下,它只是开始在日志中抛出“内存已满”警告,但生产者应用程序中的 jmsTemplate.convertAndSend 方法只是挂起。
我尝试为 systemUsage 属性设置 sendFailIfNoSpace="true"
选项。在这种情况下,生产者应用程序刚刚开始在 convertAndSend
上抛出 org.springframework.jms.ResourceAllocationException:Usage Manager Store is Full
异常,并且无论如何都没有切换到良好的代理实例。
有人可以建议如何在异常和/或“内存已满”情况下进行故障转移吗?
最佳答案
当代理内存不足时,生产者将被阻塞,直到清除一些内存为止。这是在定期使用消息的假设下进行的。
真正应该担心的是队列内存不足的原因。
您生成消息的速度是否比使用消息的速度快?如果是这样,故障转移不会真正帮助您,因为下一个代理将很快耗尽内存。 ActiveMQ 支持生产者流量控制,以确保生产者不会压垮代理。 (see here)
消费的消息发生了什么?它们会永久保存吗?如果是这样,请考虑使用 timeToLive 来确保为传入消息腾出空间。
如果由于某种原因,您需要一个又一个地填充队列,您可以在生产者中捕获异常并手动进行故障转移。
另请参阅类似的问题:ActiveMQ: Reject connections from producers when persistent store fills
关于java - ActiveMQ:如果内存/数据存储已满,则进行故障转移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19663812/