1、消息投递服务
RabbitMQ是一种消息投递服务,怎么理解这句话呢?即RabbitMQ即不是消息的生产者,也是消息的消费者.他就像现实生活中快递模式,消费者在电商网站上下单买了一件商品,此时对应的生产者(商家)则生产了一件货物(概念上的生产,可能已经生产好了),接着生产者(商家)将货物发送给快递公司,因为消费者下单了这个货物,相当于订阅了这件货物,所以快递公司将会把这件货物发送给对应的消费者.RabbitMQ就相当于这里面的快递公司.服务在生产者和消费者之间建立桥梁,即通信.
2、RabbitMQ的实现消息投递的方式
生产者创建消息(包含消息的(有效载荷-即有效的信息,注:他不会关心消息的内容)和(标签-发送给哪个消费者,注:RabbitMQ会根据标签吧消息发送给感兴趣的对方)),发布到对应的代理服务器.具体流程图如下
但是,上面的图并不是非常准确,因为消费者并不会订阅其中的某一条消息,消费者连接到代理服务器,且他只会订阅一个消息队列,当生产者向消费者所订阅的消息队列上发送数据时,那么消费者会接收到该队列的数据.
且在RabbitMQ在消息路由的过程中,消息的标签并没有随有效载荷一同传递,除非生产者在消息的有效载荷中显示指定了消息的实际生产者,所以正常情况下,RabbitMQ并不会告诉消费者谁生产了这个消息.
3、信道
(1)、传统TCP连接RabbitMQ存在的问题
在使用RabbitMQ生产消息或者消费消息时,应用程序必须连接到RabbitMQ,所以通常情况下,你需要建立一个TCP连接,向数据库一样,但是建立TCP连接的代价是很大的,这也说明了为什么在使用SqlClient或者其他数据库操作类库时,使用IDbConnection后,必须释放的原因.且操作系统每秒创建TCP连接的数量有限.如果你知道套接字这个坑的话.所以高峰期使用线程去创建RabbitMQ连接,显然存在性能瓶颈.
(2)、为什么要使用信道
为了解决(1)中的问题,RabbitMQ采用了信道的概念,即所有应用程序线程共用一个TCP连接,连接到RabbitMQ,线程调用RabbitMQ发布或者消费消息时,会在现有的TCP连接上创建一个信道,完成余下的操作.因为你可以每秒成千上万的创建信道而不会影响操作系统.同时你可以试试每秒成千上万的创建数据库连接,对比试试.
注:TCP连接和信道时包含关系,即TCP连接包含信道.在一条TCP连接上创建信道是没有限制的
4、使用RabbitMQ搭建RPC服务器
本系列文章跳过了RabbitMQ基础部分的介绍,直接进入RabbitMQ的RPC服务器构建,因为网上关于基础RabbitMQ的使用已经有很多,可以自行百度,关于基础(队列、交换机、信道等概念)可以参考https://www.cnblogs.com/stulzq/p/7551819.html,写的很好.下面进入正题.