1.什么是RabbitMQ?
采用AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦。
2.为什么要使用RabbitMQ?
它有一系列的优势,诸如:
(1)在分布式系统下具备异步,削峰,负载均衡等一系列高级功能;
(2)在保证数据不丢失的前提做到高可靠性,可用性,拥有持久化的机制,进程消息,队列中的信息也可以保存下来。
(3)实现消费者和生产者之间的解耦。
(4)对于高并发场景下,利用消息队列可以使得同步访问变为串行访问达到一定量的限流,利于数据库的操作。
3.RabbitMQ的核心概念:
Message acknowledgment
message ackonwledgment 即消息回执,消费者在消费完消息后发送一个回执给rabbitmq,rabbtiMq收到回执后才将消息从队列中删除,如果没有收到回执并检测到消费者的RabbitMQ连接断开,那么会将该消息发送给其他消费者进行处理。这里不存在timeout概念,一个消费者处理消息时间再长也不会导致该消息被发送给其他消费者,除非它的RabbitMQ连接断开。
Message durability
消息持久化,即RabbitMQ服务重启的情况下,也不会丢失消息,我们可以将Queue与Message都设置为(durable),这样可以保证绝大部分情况下我们的RabbitMQ消息不会丢失。小概率丢失事件无法避免(比如RabbitMQ服务器已经接收到生产者的消息,但还没来得及持久化该消息时RabbitMQ服务器就断电了),如果我们需要对这种情况也要处理,那么我们要用到事务。
Prefetch count
消费者在开启acknowledge的情况下,对接收到的消息可以根据业务的需要异步对消息进行确认,prefetch允许为每个consumer指定最大的unacked messages数目。例如:设置prefetchCount=10,则Queue每次给每个消费者(假设一共2个AB)发送10条消息,消费者无需马上回应,消费者将10条消息缓存本地客户端;当一个消费者处理完1条消息后Queue会再给该消费者发送一条消息。如果两个消费者都没有回复任何一条ack,则queue就不会继续发送消息。
Exchange
即交换机 在RabbitMQ中生产者不会直接将消息发送队列。实际的情况是,生产者将消息发送到Exchange,由Exchange将消息路由到一个或多个Queue中(或者丢弃)。
RoutingKey
routingKey针对生产者而言,发送消息时一般需要指定routingkey,而这个routing key需要与Exchange Type及binding key联合使用才能最终生效。
Binding
Binding将Exchange与Queue关联起来,这样RabbitMQ就知道如何正确地将消息路由到指定的Queue了。
BindingKey
在绑定Exchange与Queue的同时,一般会指定一个binding key;生产者将消息发送给Exchange时,一般会指定一个routing key;当binding key与routing key一致,或者符合模式匹配,消息就会被路由到对应的Queue中。在绑定多个Queue到同一个Exchange的时候,这些Binding允许使用相同的binding key。binding key 并不是在所有情况下都生效,它依赖于Exchange Type,比如fanout类型的Exchange就会无视binding key,而是将消息路由到所有绑定到该Exchange的Queue。
Exchange Types
RabbitMQ常用的Exchange Type有fanout、direct、topic、headers这四种
Queue:存储消息接收者(消费者)的消息
ConnectionFactory:与RabbitMQ服务器连接的管理器
Connection:与RabbitMQ服务器的连接
Channel:与Exchange的连接
4.RabbitMQ的整体架构
(1)创建ConnectionFactory,通过ConnectionFactory创建Connection,通过Connection创建Channel
(2)通过channel,声明一个Exchange名字为“Exchange1”,声明一个Queue名字为“Queue1”
(3)然后就需要让他们绑定了,让“Exchange1”绑定到“Queue1”上,设置绑定的RoutingKey(真实情况下参数名都是RoutingKey,没有BindingKey这个参数,为了区别用户发送的和我们绑定的概念,我们才说RoutingKey和BindingKey)为“key1”
(4)然后通过Channel发送消息,发送消息的三个参数Exchange名称、RoutingKey,和消息,Exchange名称就是“Exchange1”,RoutingKey就是“key1”,那么这样这条消息就会被成功发送到“Queue1”中了。
(5)消费者通过监听Queue1就可以消费消息了。
5.RabbitMQ的使用场景?
(1)服务间异步通信
(2)顺序消费
(3)定时任务
(4)请求削峰