项目问题
在我们开发项目过程中,我们在进行某些耗时操作的时候,我们需要等待操作完成返回结果,再执行下一步操作;
举个栗子(我们模拟一个需求,不考虑采用异步回调的情况)
1、用户在系统进行了一个在线话费充值的操作;
2、系统收到用户的订单往运营商空充接口进行提单操作;
2、运营商空充接口返回充值成功或失败处理信息;
3、系统对用户进行成功/失败(返款)操作
那么过程中产生的问题就是:运营商接口返回过程如果非常耗时,那么程序此时是需要一直等待接口的返回数据以便一下步对用户充值成功或失败的操作;
模拟的解决思路
我们是否可以将一些无需即时返回且耗时的操作提取出来进行异步处理;
1、用户下单后只需要知道下单是否成功;
2、系统会读取用户订单信息往运营商空充接口进行提单;
3、接口返回结果后再异步通知用户充值成功或失败(返款);
这种异步处理的方式大大的节省了服务器的请求响应时间,用户也无需一直等待着结果,用户最终只关心充值成功否,从而提高了系统的吞吐量,那么就带出了我们今天要讲的RabbitMQ
什么是RabbitMQ
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全
RabbitMQ是一个开源免费的AMQP实现,服务器端用Erlang语言编写,支持多种客户端;
AMQP的协议模型
RabbitMQ的安装
之前的文章中已经写过一篇具体的安装配置可以点击:
Windows系统安装最新版本RabbitMQ服务器及基本配置 https://blog.youkuaiyun.com/lhmyy521125/article/details/86643686
由于博主的开发环境是基于windows 如需其他系统环境的安装请自行百度
RabbitMQ的基本概念
ConnectionFactory
ConnectionFactory(连接工厂): 生产Connection的的工厂
Connection
Connection(连接)是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑。ConnectionFactory为Connection的制造工厂
Channel
Channel(通道)是我们与RabbitMQ打交道的最重要的一个接口,我们大部分的业务操作是在Channel这个接口中完成的,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息、消费消息等;一个连接Connection可以有多个Channel,我们可以想象成经常看到的网线(Connection) 里面的多条铜线(Channel)
Exchange
Exchange(交换机):生产者会将消息发送到交换机,然后交换机通过路由策略(规则)将消息路由到匹配的队列中去,
Routing Key
Routing Key(路由键):一个String值,用于定义路由规则,在队列绑定的时候需要指定路由键,在生产者发布消息的时候需要指定路由键,当消息的路由键和队列绑定的路由键匹配时,消息就会发送到该队列
Queue
Queue(队列)是RabbitMQ的内部对象,用于存储消息,可以看成一个有序的数组,如下图
RabbitMQ中的消息都只能存储在Queue中,生产者(下图中的P)生产消息并最终投递到Queue中,消费者(下图中的C)可以从Queue中获取消息并消费
多个消费者可以订阅同一个Queue,这时Queue中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理
Binding / Binding key
Binding(绑定)RabbitMQ中通过绑定,以路由键作为桥梁将Exchange与Queue关联起来(Exchange—>Routing Key—>Queue),这样RabbitMQ就知道如何正确地将消息路由到指定的Queue了
Binding key(String):在Binding 中我们已经了解到,我们可以把Binding key理解成 Exchange 与 Queue 关联的标识字符,当生产者发布消息的时候会需要一个Routing Key 标识 ,当 Routing Key == Binding key 的时候,消息最终将会被路由到对应的Queue中
Exchange Types
RabbitMQ常用的Exchange Type有fanout、direct、topic、headers这四种,这里我们先有一个认识,在往后的文章代码样例中我们再分别用实例来介绍讲解;
Producer 和 Consumer
Producer(生产者):生产者用于发布消息
Consumer(消费者):消费者从队列中获取消息
总结
本文介绍了RabbitMQ中的一些常规概念,或许第一次接触RabbitMQ的你依然云里雾里,没关系在接下来时间里,我会用样例来让大家慢慢理解~谢谢大家