我想将我的 ActiveMQ 生产者配置为在代理达到配置限制时进行故障转移(我使用的是 Stomp 协议(protocol))。我想让消费者继续从重载的经纪人那里消费,有增无减。
阅读 ActiveMQ 文档,看起来我可以配置 ActiveMQ 在代理达到其限制(内存或磁盘)时执行以下操作之一:
- 使用
ProducerFlowControl="true"
减慢消息速度(通过阻止发送) - 使用
sendFailIfNoSpace="true"
时引发异常 - 以上都不是,在这种情况下..我不确定会发生什么?恢复到 TCP 流量控制?
看起来这些东西都不是为了触发生产者故障转移而设计的。生产者在连接失败时会进行故障转移,但据我所知,在发送失败时不会(例如,由于生产者流控制)。
那么,我是否可以将代理配置为在达到限制时拒绝连接?或者我最好的选择是检测生产者方面的速度减慢,并手动重新配置我的生产者以当时使用不同的代理?
谢谢!
最佳答案
最好的选择是使用sendFailIfNoSpace
,或者更好的sendFailIfNoSpaceAfterTimeout
。这将向您的客户端抛出异常,然后客户端可以尝试将消息重新发送到应用程序级别的另一个代理(尽管您可以将此逻辑封装在 Stomp 库的顶部,并在代码中使用此外观)。尽管如果您的 ActiveMQ 设置正确连接,那么您在生产和消耗方面的负载应该或多或少均匀地分布在您的代理之间,因此此功能可能不会给您带来太多好处。
如果您专注于消息的快速消耗,并增加存储限制以消除负载峰值,您可能会获得更好的结果。
关于ActiveMQ:当持久存储填满时拒绝来自生产者的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16661586/