赞
踩
一般的,在rabbitmq中,如果采用 direct 类型的exchange, 相同队列的多个消费者,消费时通过 轮询的方式,消息一次发送给A,下一条消息就发送给B, 再来一条消息就发送给 A
但是现在的场景就是即使有多个消费者实例,我只想让一个消费者消费,其他消费者作为备选,即 有消费者A,B,C, 我发送消息,只有 A 实例在消费,B,C 两个消费实例不消费消息
可以看见, 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!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。