RabbitMQ是一款开源的消息队列中间件,拥有非常好用的管理控制面板,类似使用navicat一样,简便的操纵数据库。
应用场景
一、流量削峰
在一些并发量较高的场景下,比如秒杀活动,抢票等,同一时间访问量急剧增大,处理业务的服务器由于业务比较繁琐,比较脆弱,此时可以使用消息队列作为中转,大量请求先发送到消息队列,处理业务的服务器再根据自己的节奏,从消息队列中获取消息并处理。
二、解耦
如果服务器A直接与服务器B进行通信,当A这边想要修改代码,或者A服务挂了, 可能会导致服务器B需要修改代码。如果使用消息队列,服务器B只需要关注消息队列中的数据,不需要管服务器A中是怎么去写代码的。
三、异步
当我们想要将数据写入到数据库中,然后再同步到缓存中,此时我们发现,这是一条线性的方式,如果使用消息队列,将数据发送到消息队列,写入缓存的服务器和写入数据库的服务器去订阅消息队列,一旦有数据,就可以并行执行。
四、消息分发
当我们的系统想要再添加一个模块来获取之前的数据,就可以直接去订阅消息队列,后续消息就会被转发过来,然后就可以执行处理了。一旦下游想要上游的数据了,就添加一个订阅者即可。
工作流程
使用rabbitmq主要分为如下几部:
1)创建连接:Producer连接到RabbitMQ服务器,通过ConnectionFactory建立Connection,开启一个channel。
2)声明交换机队列以及绑定关系:Producer声明⼀个交换机(Exchange)和队列(Queue),并将队列绑定到交换机。
3)发布消息:Producer发送消息⾄RabbitMQ服务器。
4)消息存储及转发:RabbitMQ接收到消息,根据绑定关系进行消息分发,存储到相应队列中。
5)消费消息::消费者监听Queue,当消息到达时,从Queue中获取消息,处理后,向RabbitMQ发送消息确认。
6)消息删除:消息被确认后,RabbitMQ会把消息从Queue中删除。
特性
在RabbitMQ中主要有这么几个特性:
1)发布确认:用来保证可靠性的方式之一,运用在生产者一方。解决的是保证发布的消息能到达消息队列服务器以及消息能被交换机正确转发到队列。对应着两种模式:confirm和return模式。
2)持久化:用来保证可靠性的方式之一,运用在消息队列服务器。可以对交换机、队列、消息进行持久化,当服务器挂了,后续重启恢复消息。
3)消息确认:用来保证可靠性的方式之一,运用在消费者一方。可以通过配置的方式来选择,消息者在获取到消息时,是自动应答,还是手动应答,当接收到应答时,删除消息。
4)重试机制:在消息传递的过程中,可能会遇到网络故障等问题,rabbitmq还提供了重试机制,当消息发送失败,会进行重新发送。
5)TTL:过期时间,RabbitMQ提供了可以设置队列和消息的过期时间。设置队列的TTL,即队列中的所有消息的过期时间都为队列的TTL,或者可以单独设置消息的TTL。但需要注意设置消息TTL后,消息到了过期时间不一定会立马删除,需要等待队列前面的消息都过期了,才会删除。
6)死信队列:用来存放无法被消费的队列。当消息过期或者nack或者队列到达最大长度无法接收,此时消息会变成死信,然后根据配置,发送到死信交换机,再到死信队列中。
7)延迟队列:即等待一定时间后,消费者才可以消费这条消息。但RabbitMQ本身没有直接提供延迟队列的功能,但可以通过TTL+死信队列的方式进行实现或者添加一个RabbitMQ的官方延迟插件。
8)事务:将操作变成原子的,要么全部成功,要么相当于没执行。
9)负载均衡、限流:可以通过参数配置的方式来限定消费者所能保持最大未确认消息的数量。以此达到限流或者负载均衡的效果。