首页 > 解决方案 > 使用 Spring Boot 应用程序出现 RabbitMQ 集群节点故障

问题描述

我有一个连接到 RabbitMQ 集群的 Spring Boot 应用程序(作为 Cloud Foundry 中的服务)。当集群中的主节点发生故障并且由于某种原因该节点没有出现但应用程序(消息使用者)试图连接到故障节点并且没有尝试连接到其他可用节点时。有人可以建议一些弹簧配置来解决这个问题吗?

17:36:23.829: [APP/PROC/WEB.0] Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - home node 'rabbit@rad33f2b1-mq-1.node.dc1.svvc' of durable queue 'FAILED_ORDER' in vhost '/' is down or inaccessible, class-id=50, method-id=10)

'rabbit@rad33f2b1-mq-1.node.dc1.svvc' 是故障节点。

为了不断尝试连接到失败的节点,我有以下弹簧配置。spring.rabbitmq.listener.simple.missing-queues-fatal=false

@Configuration
public class MessageConfiguration {

public static final String FAILED_ORDER_QUEUE_NAME = "FAILED_ORDER";

public static final String EXCHANGE = "directExchange";

@Bean
public Queue failedOrderQueue(){
    return new Queue(FAILED_ORDER_QUEUE_NAME);
}

@Bean
public DirectExchange directExchange(){
    return new DirectExchange(EXCHANGE,true,false);
}

@Bean
public Binding secondBinding(Queue failedOrderQueue, DirectExchange directExchange){
    return BindingBuilder.bind(failedOrderQueue).to(directExchange).with(FAILED_ORDER_QUEUE_NAME);
}

}

标签: javaspring-bootrabbitmqcloud-foundryspring-rabbit

解决方案


当您使用具有不正确主定位器的非 HA 自动删除队列时,可能会发生这种情况。

如果主定位器不是client-local,则自动删除队列可能会在与我们连接的节点不同的节点上创建。在这种情况下,如果主机节点出现故障,您将遇到此问题。

为避免自动删除队列出现此问题,请将x-queue-master-locator队列参数设置为client-local或在代理上设置策略以对匹配此名称的队列执行相同操作。

但是,您没有使用自动删除队列...

@Bean
public Queue failedOrderQueue(){
    return new Queue(FAILED_ORDER_QUEUE_NAME);
}

使用集群和非 HA 队列时,不会复制队列,因此,如果拥有节点出现故障,您将收到此错误,直到拥有节点恢复。

为避免此问题,请设置策略以使队列成为镜像 (HA) 队列。

https://www.rabbitmq.com/ha.html


推荐阅读