RabbutMQ
什么是MQ?
MQ (Message Queuing) ,消息队列。
AMQP
什么是AMQP?
AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是进程之间传递异步消息的网络协议。
AMQP工作过程
发布者(Publisher)发布消息(Message),经过交换机(Exchange),交换机根据路由规则将收到消息分发给交换机绑定的队列(Queue),最后AMQP代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取。
Publisher和Consumer就好比两个Java项目,AMQP实后面就是RabbitMQ
队列
队列是数据结构中概念。数据存储在一个队列中,数据是有顺序的,先进的先出,后进后出。其中一侧负责进数据,另一次负责出数据。
MQ(消息队列)很多功能都是基于此队列结构实现的,队列也是解决高并发下排队问题的解决方案,即使恰巧出现同一时刻向队列添加的两个数据,也会有CPU帮助判断,放入到队列后,一定会有先后顺序。
RabbitMQ
RabbitMQ是由Erlang语言(脚本语言)编写的基于AMQP的消息中间件。而消息中间件作为分布式系统重要组件之一,可以解决应用耦合,异步消息,流量削峰等问题。
RabbitMQ两大核心特性:异步消息、队列。
异步消息
:只要异步消息就不阻塞线程,减少了主线程执行时间。所有需要这种效果场景都可以使用MQ。
队列
:进入队列的数据一定有先后之分。只要应用程序要对内容分先后的场景都可以使
使用MQ解决耦合
客户端发送消息只需要向MQ发送,不需要向服务端发送。
客户端只需监听MQ中消息,有消息取出即可,不需要管客户端。
此时认为客户端和服务端解耦,它们两个没有直接联系了。
RabbitMQ原理(面试问题)
RabbitMQ如何工作的?
首先来看看RabbitMQ里的几个重要概念:
- 生产者(Producer):发送消息的应用。
- 消费者(Consumer):接收消息的应用。
- 队列(Queue):存储消息的缓存。
- 消息(Message):由生产者通过RabbitMQ发送给消费者的信息。
- 连接(Connection):连接RabbitMQ和应用服务器的TCP连接。
- 通道(Channel):连接里的一个虚拟通道(信道)。当你通过消息队列发送或者接收消息时,这个操作都是通过通道进行的。
- 交换机(Exchange):交换机负责从生产者那里接收消息,并根据交换类型分发到对应的消息列队里。要实现消息的接收,一个队列必须到绑定一个交换机。
- 绑定(Binding):绑定是队列和交换机的一个关联连接。
- 路由键(Routing Key):路由键是供交换机查看并根据键来决定如何分发消息到列队的一个键。路由键可以说是消息的目的地址。
客户端应用程序向RabbitMQ发送消息Message,在Message会包含路由键Routing Key,
交换器Exchange接收到消息Message后会根据交换器类型Exchange Type解决把消息如何发送给绑定的队列Queue中,
如果交换器类型是Direct这个消息只放入到路由键对应的队列中
如果是topic交换器消息放入到routing key匹配的多个队列中,
如果是fanout交换器消息会放入到所有绑定到交换器的队列中。等放入到队列中之后RabbitMQ的事情就结束了。
剩下的事情是由Consumer进行完成,Consumer一直在监听队列,当队列里面有消息就会把消息取出,取出后根据程序的逻辑对消息进行处理
RabbitMQ使用场景
排队算法
使用队列特性。把数据发送给MQ,进入到队列就有了排队的效果
秒杀活动
使用队列特性。例如:抢红包、限时秒杀、直播卖货时抢商品。使用了MQ按照顺序一个一个操作,当商品库存操作到0个时,秒杀结束
消息分发
在程序中同时向多个其他程序发送消息。应用了AMQP中交换机,实现消息分发。
异步处理
利用MQ异步消息特性。大大提升主线程效率。
数据同步
利用异步特性。我们电商中使用RabbitMQ绝大多数的事情就是在实现数据同步
处理耗时任务
利用异步特性。可以把程序中耗时任务(例如:发送邮件、发送验证码)交给MQ去处理,减少当前项目的耗时时间。
流量削峰
在互联网项目中,可能会出现某一段时间范围内,访问流量骤增的情况(双11、品牌促销,10点抢购),如果使用监控工具,会发现这段时间访问出现顶峰。使用MQ可以把这些访问分摊到多个项目中,把流量分摊,去除了顶峰效果,这就叫做流量削锋。·
利用RabbitMQ中交换机实现的。
内,访问流量骤增的情况(双11、品牌促销,10点抢购),如果使用监控工具,会发现这段时间访问出现顶峰。使用MQ可以把这些访问分摊到多个项目中,把流量分摊,去除了顶峰效果,这就叫做流量削锋。·
利用RabbitMQ中交换机实现的。