当前位置:   article > 正文

rabbitmq 多实例消费者,只允许一个实例消费者消费_x-single-active-consumer

x-single-active-consumer

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);
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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

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
  • 1
  • 2

当我们停掉 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
  • 1
  • 2

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

good luck!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/621020
推荐阅读
相关标签
  

闽ICP备14008679号