RabbitMQ的工作原理
- Producer:消息生产者,发送消息
- Broker:消息队列服务进程,包括Exchange 和 Queue
- Exchange:消息队列交换机,按照一定的规则将消息路由转发到某个队列
- Queue: 消息队列,存储消息的队列
- Consumer:消息消费者,接受消息
消息生产者发送消息的流程:
- Producer 和 Broker 建立 TCP 链接
- Producer 和 Broker 建立通道
- Producer 通过 通道 消息发送给 Broker ,由Exchange将消息接收进行转发
- Exchange 将消息转发到指定的Queue
消息消费者接受消息的流程:
- Consumer 和 Broker 建立 TCP 链接
- Consumer 和 Broker 建立通道
- Consumer 监听指定的 Queue
- 当有消息到达Queue时 Broker 会默认将消息推送给消费者
- 消费者接受消息
- 通过ack回复
消息确认机制(ACK)
ACK分为两种情况:
- 自动ACK:消息一旦被接收,消费者自动发送ACK
- 手动ACK:消息接收后,不会发送ACK,需要手动调用
如果对消息的重要性要求低,可以接受部分消息丢失,那么自动ACK会比较方便。
如果对消息的重要性要求很高,不容丢失,那么最好在消费完成后手动ACK。
面试题:
RabbitMQ是什么?
RabbitMQ是实现了高级消息队列协议的开源消息代理软件,也称为面向消息的中间件。
RabbitMQ的特点
可靠性:会使用一些机制来保证消息可靠性,如持久化、传输确定和发布确认等
扩展性:多个RabbitMQ节点可以组成一个集群,可以根据实际业务情况动态的扩展
高可用性:可以在集群的机器上设置镜像,可以使的在部分节点出现问题的情况下队列依然可用
灵活的路由:在消息进入队列之前,可以通过交换器来路由消息。
管理界面:RabbitMQ提供了一个易用的用户界面,是的用户可以监控和管理消息
如何避免消息堆积?
- 采用workqueue,多个消费者监听同一队列
- 接受消息以后,通过线程池,异步消费
如果避免消息丢失?
- 消费者手动ACK,可以防止消费者丢失消息
- 可以将消息进行持久化,要将消息持久化,前提是:队列、exchange都持久化