高并发场景下,多线程的单消费者不一定满足业务需求,需要部署多消费者才能满足业务需求。
MQ下,多个消费者绑定同一个队列是无法同时消费的,一个消息只能被一个消费者消费。
因为 RabbitMQ 有队列的负载均衡机制,消息会被负载到每个消费者进行消费,无法同时被多个消费者消费,多个消费者监听同一个队列,RabbitMQ 会进行消息的轮询分发。
但轮询分发消息+自动确认机制(消费者拿到消息就删除队列中消息),在某消费者宕机的情况下是不可行的,会丢失消息。为实现这个容灾能力,需要实现手动确认消息+一个通道只放一个消息,即实现了消费者的能者多劳。
工具
1 | import com.rabbitmq.client.Connection; |
生产者
1 | import com.peabody.utils.ConnectionUtil; |
消费者
消费者1
1 | import com.peabody.utils.ConnectionUtil; |
消费者2
1 | import com.peabody.utils.ConnectionUtil; |