rabbitmq 多实例消费者,只允许一个实例消费者消费

一般的,在rabbitmq中,如果采用 direct 类型的exchange, 相同队列的多个消费者,消费时通过 轮询的方式,消息一次发送给A,下一条消息就发送给B, 再来一条消息就发送给 A

但是现在的场景就是即使有多个消费者实例,我只想让一个消费者消费,其他消费者作为备选,即 有消费者A,B,C, 我发送消息,只有 A 实例在消费,B,C 两个消费实例不消费消息

SAC(Single Active Consumer)

在这里插入图片描述

可以看见, C1 掉线后,C3 自动顶上来了

实现

通过声明 SAC 类型的队列,即在创建队列的时候,增加额外参数 x-single-active-consumer=true :

在这里插入图片描述

创建好队列之后 ,就可以看见 队列上有一个 SAC的标签:

在这里插入图片描述

当有消费者监听时:

在这里插入图片描述

消费者上有 single active 标签的就说明是正在消费的客户端

spring boot 正常创建监听消费者:

@RabbitListener(
    bindings = @QueueBinding(
        exchange = @Exchange(value = "like.exchange"),
        value = @Queue(value = "user.like.queue", durable = "true"),
        key = "user.like.key"))
public void userLike(Message message) {
    String messageStr = "";
    try {
        messageStr = new String(message.getBody(), StandardCharsets.UTF_8);
        log.info("<<<<<<<<< message:{}", messageStr);
        System.out.println("port: "+ port);
    } catch (Exception e) {
        log.error("######### message : {}-{}", messageStr, e);
    }
}

发现只有一个客户端消费了消息

2023-11-23 18:57:20.812 INFO 28556 --- [ntContainer#1-1] message:hello port: 8080
2023-11-23 18:57:21.364 INFO 28556 --- [ntContainer#1-1] message:hello port: 8080

当我们停掉 8080 消费者客户端时,可以发现:

在这里插入图片描述

发现 8081 客户端已经升级为正在消费者:

2023-11-23 19:57:20.812 INFO 28556 --- [ntContainer#1-1] message:hello port: 8081
2023-11-23 19:57:21.364 INFO 28556 --- [ntContainer#1-1] message:hello port: 8081

相关 rabbitmq 文档 rabbitmq- SAC(Single Active Consumer)

good luck!

更多推荐