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

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!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的RabbitMQ多线程消费端处理的示例代码: ```python import pika import threading class ConsumerThread(threading.Thread): def __init__(self, thread_id, queue_name): threading.Thread.__init__(self) self.thread_id = thread_id self.queue_name = queue_name def run(self): connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) channel = connection.channel() channel.queue_declare(queue=self.queue_name) def callback(ch, method, properties, body): print("Thread %d received %r" % (self.thread_id, body)) # do some processing here channel.basic_consume(queue=self.queue_name, on_message_callback=callback, auto_ack=True) channel.start_consuming() # create 5 consumer threads threads = [] for i in range(5): thread = ConsumerThread(i, 'my_queue') threads.append(thread) # start all threads for thread in threads: thread.start() # wait for all threads to finish for thread in threads: thread.join() ``` 该代码创建了一个名为`ConsumerThread`的类,该类继承自Python的`threading.Thread`类。每个线程都需要一个线程ID和队列名称作为参数。`run()`方法是每个线程运行的主体,其中连接到RabbitMQ并从队列中接收消息。每个线程都有自己的回调函数`callback()`,用于处理每个接收到的消息。 主程序创建了5个`ConsumerThread`实例,并启动所有线程。然后,主程序等待所有线程完成。当RabbitMQ队列中的消息到达时,它们将被随机分配给一个线程进行处理。每个线程都是独立的,可以同时处理多个消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值