RabbitMQ HA 部署以避免丢失消息
RabbitMQ HA deployment to avoid lost messages
我使用以下策略在 2 个节点上设置了一个具有消息镜像的 3 节点 RabbitMQ 集群:
ha-mode: exactly
ha-params: 2
ha-sync-mode: automatic
我正在使用 Spring Boot 和 Spring AMQP 进行一些性能测试。基本上,我让 Apache JMeter 向发布消息的控制器发送 HTTP 请求:
@RequestMapping(value = "/webhook", method = RequestMethod.POST)
public void webhook(@RequestBody(required = true) String webhookBody, HttpServletRequest request) {
rabbitTemplate.convertAndSend("exchange", "key", "message");
}
具有以下配置:
spring:
rabbitmq:
addresses: rabbitmq-1:5672,rabbitmq-2:5672,rabbitmq-3:5672
我已将脚本配置为每 100 毫秒执行一次请求,而 运行 我尝试关闭一个节点。结果是 AutoRecoverConnectionNotCurrentlyOpenException
和至少 8-9 个失败的请求。
在这种情况下,您建议使用哪些其他设置来完全避免响应失败?使用像 HAProxy / Nginx 这样的第 4 层代理更好吗?
重置底层 rabbit 连接工厂的 autoRecoverEnabled
(在 1.7.0 中默认为 true);在 1.7.1 中默认为 false。
RabbitTemplate
将比客户端的自动恢复机制更快地恢复连接。
但是,为避免消息丢失,您可能需要考虑将 RetryTemplate
添加到 RabbitTemplate
。
我使用以下策略在 2 个节点上设置了一个具有消息镜像的 3 节点 RabbitMQ 集群:
ha-mode: exactly
ha-params: 2
ha-sync-mode: automatic
我正在使用 Spring Boot 和 Spring AMQP 进行一些性能测试。基本上,我让 Apache JMeter 向发布消息的控制器发送 HTTP 请求:
@RequestMapping(value = "/webhook", method = RequestMethod.POST)
public void webhook(@RequestBody(required = true) String webhookBody, HttpServletRequest request) {
rabbitTemplate.convertAndSend("exchange", "key", "message");
}
具有以下配置:
spring:
rabbitmq:
addresses: rabbitmq-1:5672,rabbitmq-2:5672,rabbitmq-3:5672
我已将脚本配置为每 100 毫秒执行一次请求,而 运行 我尝试关闭一个节点。结果是 AutoRecoverConnectionNotCurrentlyOpenException
和至少 8-9 个失败的请求。
在这种情况下,您建议使用哪些其他设置来完全避免响应失败?使用像 HAProxy / Nginx 这样的第 4 层代理更好吗?
重置底层 rabbit 连接工厂的 autoRecoverEnabled
(在 1.7.0 中默认为 true);在 1.7.1 中默认为 false。
RabbitTemplate
将比客户端的自动恢复机制更快地恢复连接。
但是,为避免消息丢失,您可能需要考虑将 RetryTemplate
添加到 RabbitTemplate
。