一个事物老是会关联着不少事物。java
要了解RabbitMQ,先了解 AMQP,要了解AMQP,先了解MQ。node
(1)MQ mysql
Message Queue 消息队列,简称MQ,用于跨进程之间的上下游非实时通讯。此处的上下游是平行关系。
MQ适用场景:上下游之间须要进行低频、非实时通讯、上下游之间业务不相互依赖。
MQ不适用场景:高频、实时、上下游相互依赖、耦合。此时用方法调用的方式。(方法调用或远程调用)。
MQ是一种技术的统称。redis
(2) AMQP算法
一种应用层协议,专用用于消息通讯,算是一个RFC标准(HTTP1.1 定义在RFC2616中)。应用层协议不须要了解太多。只须要了解OSI七层模型中,TCP和UDP 位于传输层,基于TCP/UDP之上的协议后来都是应用层协议。
这些协议的区别在我看来无非就是长链接、短连接,报文协议格式不一样而已。既如此,理解HTTP就够了。AMQP、RSTP、MQTT、FTP、WebSocket、SMTP... 这些协议,有需求再去理解。通常也不用去理解,会有对应的框架和技术来屏蔽各类协议,让你面向对象或者面向API开发。sql
AMQP是一种通讯协议。apache
(3)RabbitMQnpm
Tomcat,Nginx,Apache 都按照HTTP协议去实现,因此它们的相同点就是都是HTTP服务器。RabbitMQ是一种实现了AMQP协议的软件程序。天然叫作消息服务器。和HTTP服务器相似,通讯双方一个叫作客户端,一个叫作服务端。只不过在RabbitMQ是一种专门用于接受消息的服务器。而它们接受消息的目的,是为了暂时保存、以便其它客户端获取,因此RabbitMQ服务端的确是一个消息中转站,负责接受和保存消息。而RabbitMQ客户端,咱们之前称之为上下游。如今咱们给它一个更具体的名称:生产者 或者消费者。产生消息的客户端就是生产者、拿走消息的客户端就是消费者。编程
举个例子:
如今有两个系统:一个是开奖系统A、一个是其余业务系统B。开奖系统只负责开奖,可是考虑到别人可能须要知道开奖结果,因此A产生一个消息放到中转站中,业务系统B从中中转站拿走这个消息。 这个场景,就适合用RabbitMQ。A系统就是上游,就是消息生产者。中转站就是RabbitMQ,接受消息的地方。B系统就是下游,就是消费者,从中转站中拿走消息。A不依赖于B,B不依赖于A,二者之间的通讯既不用那么实时、高频,也不是相互依赖。RabbitMQ这个中间件起的就是一个解耦的做用。缓存
至此,对RabbitMQ已有大概认识。RabbitMQ 是消息服务器、有消息存储功能,提供了算法实现。其余客户端只须要把消息放在这,或者从这拿走消息就好了。
(4) 如何使用RabbitMQ(没有具体的代码,只是粗略的步骤而已。)
首先要搭建RabbitMQ服务器。
去官网下载软件,安装,启动服务。没错就像安装mysql、redis、apache那样。有配置文件吧,也许。但我目前还不知道。由于没具体学习。
其次生产者系统要在须要发消息的时候产生消息发给RabbitMQ服务器
发消息,确定要是客户端干的事情。若是是java语言,去找对应的maven依赖。若是是node.js,去找对应的npm包。
而后创建链接,发消息就好了。创建链接是须要帐号、密码、虚拟机等这些信息的。而后就是用不一样的工做模式的调用API发消息。
RabbitMQ就会收到消息。
与此同时消费者系统要 开启监听,等待消息从RabbitMQ服务器的到来
相似同上步骤,选择语言、包,创建链接。而后就是监听消息。
(5) RabbitMQ工做模式
RabbitMQ提供了各类编程语言的客户端支持。对java来讲,RabbitMQ客户端就是一个jar。使用java的RabbitMQ客户端开发包能够,
把消费发送给RabbitMQ服务器-------生产者。
还能够经过监听,接受RabbitMQ那里的消息(赌一包辣条,底层是TCP长链接实现的全双工) ------------消费者。
在学习多线程的时候,就已经模拟过生产者和消费者的场景了。要么一个生产者、一个消费者,要么是一个生产者,多个消费者。。。状况比较多,
RabbitMQ也会面临这样的选择,RabbitMQ的工做模式:(从CSDN借用一个图 https://blog.csdn.net/hellozpc/article/details/81436980 )
简单模式:一个生产者,一个消费者
work模式:一个生产者,多个消费者,每一个消费者获取到的消息惟一。
订阅模式:一个生产者发送的消息会被多个消费者获取。
路由模式:发送消息到交换机而且要指定路由key ,消费者将队列绑定到交换机时须要指定路由key
topic模式:将路由键和某模式进行匹配,此时队列须要绑定在一个模式上,“#”匹配一个词或多个词,“*”只匹配一个词。
RPC模式:
(6) 个人需求
现有 应用系统A、应用系统B、底层硬件系统C。 A依赖于B的数据,但不和C发生直接通讯,B和C之间经过4G模块进行频繁、实时通讯。数据量有的比较大、有的比较少。 B的确须要一些中间件来缓存一些实时数据(一小段时间内不覆盖,长时间覆盖),在A须要的时候可从B这里拿,实现间接的实时。有可能有人会有疑问,为何须要B?把B剔除掉,A和C通讯不就完事了吗? 的确如此。但是A已经开发好,由甲方开发。B和C由乙方开发。个人最终的方案和目标是:把B开发出来,做为一个子系统给A去调用(A的先后台均可能会调用B)。也就是分布式系统。 综上,RabbitMQ并不能解决个人问题。因此我没有系统学习它。而是花了几个小时的时间大概了解了它,而后写下了这篇博文。