spring 启动应用程序导致 RabbitMQ 集群节点故障

RabbitMQ cluster node failure with spring boot application

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

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 配置。 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);
}

}

当您使用带有不正确主定位器的 non-HA auto-delete 队列时,可能会发生这种情况。

如果主定位器不是 client-local,auto-delete 队列可能会在与我们连接的节点不同的节点上创建。在那种情况下,如果主机节点宕机,你就会遇到这个问题。

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

但是,您没有使用 auto-delete 队列...

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

当使用集群和 non-HA 队列时,队列不会被复制,因此,如果所属节点出现故障,您将收到此错误消息,直到所属节点重新启动。

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

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