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