RabbitMQ⼊门介绍、安装、代码案例
⼀、消息中间件介绍
mysql知识教程引⾔:为什么要使⽤消息中间件?什么时候使⽤消息中间件?
举个栗⼦
我们客户端发送⼀个下单请求给订单系统(order)订单系统发送了 ⼀个请求给我们的库存系统告诉他需要更改库存了,我已经下单了,这⾥,每⼀个请求我们都可以看作⼀条消 息, 但是我们客户端需要等待订单系统告诉我这条消息的处理结果(我到底有没有下单成功)但是订单系统不需要知道库存系统这条消息的处理情况因为⽆论你库存有没有改动成功,我订单还是下了,因为是先下完了订单(下成功了)才去更改库存,库存如果更改出BUG了那是库存系统的问题,这个BUG不会影响订单系统。如果这⾥你能理解的话,那么我们就能发现我们⽤户发送的这条消息(下订单),是需要同步的(我需要知道结果),订单发送给库存的消息,是可以异步的(我不想知道你库存到底改了没,我只是通知你我这边成功下了⼀个订单) 那么如果我们还按原来的⽅式去实现这个需求的话,那么结果会是这样:
百度地图在线编辑器
那可能有同学说了, 我们订单系统开辟线程去访问库存系统不就好了吗?
使⽤线程池解决确实可以,但是也有他的缺点,那么到底怎么来完美解决这个问题呢?
如果这张图能理解的话,那么这个消息系统,就是我们的消息中间件。
⼆、RabbitMQ介绍&AMQP介绍
导语:我们刚刚介绍了什么是消息中间件, 那么RabbitMQ就是对于消息中间件的⼀种实现,市⾯上还有很多很多实现, ⽐如RabbitMQ、ActiveMQ、ZeroMQ、kafka,以及阿⾥开源的RocketMQ等等,本章我们主要介绍RabbitMQ。
这⾥引⽤百度的⼀句话,再加以我个⼈的理解: AMQP 其实和Http⼀样 都是⼀种协议, 只不过 Http是针对⽹络传输的, ⽽AMQP是基于消息队列的。
AMQP 协议中的基本概念
Broker: 接收和分发消息的应⽤,我们在介绍消息中间件的时候所说的消息系统就是Message Broker。
Virtual host: 出于多租户和安全因素设计的,把AMQP的基本组件划分到⼀个虚拟的分组中,类似于⽹络中的namespace概念。当多个不同的⽤户使⽤同⼀个RabbitMQ server提供的服务时,可以划分出多个vhost,每个⽤户在⾃⼰的vhost创建exchange/queue 等。
Connection: publisher/consumer和broker之间的TCP连接。断开连接的操作只会在client端进⾏,Broker不会断开连接,除⾮出现⽹络故障或broker服务出现问题。
Channel: 如果每⼀次访问RabbitMQ都建⽴⼀个Connection,在消息量⼤的时候建⽴TCP Connection的开销将是巨⼤的,效率也较低。Channel是在connection内部建⽴的逻辑连接,如果应⽤程序⽀持多线程,通常每个thread创建单独的channel进⾏通
讯,AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极⼤减少了操作系统建⽴TCP connection的开销。
小舍得电视剧星辰影院Exchange: message到达broker的第⼀站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去。常⽤的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)。
Queue: 消息最终被送到这⾥等待consumer取⾛。⼀个message可以被同时拷贝到多个queue中。
Binding: exchange和queue之间的虚拟连接,binding中可以包含routing key。Binding信息被保存到exchange中的查询表中,⽤于message的分发依据。
Exchange的类型
direct :这种类型的交换机的路由规则是根据⼀个routingKey的标识,交换机通过⼀个routingKey与队列绑定 ,在⽣产者⽣产消息的时候 指定⼀个routingKey 当绑定的队列的routingKey 与⽣产者发送的⼀样 那么交换机会吧这个消息发送给对应的队列。
fanout:这种类型的交换机路由规则很简单,只要与他绑定了的队列, 他就会吧消息发送给对应队列(与routingKey没关系)topic:因为 * 在这个笔记软件⾥⾯是关键字,所以下⾯就⽤星替换掉了。这种类型的交换机路由规则也是和routingKey有关 只不过topic他可以根据*和#( * 代表过滤⼀个单词,#代表过滤后⾯所有单词,⽤.隔开)来识别routingKey 我打个⽐⽅ 假设 我绑定的routingKey有队列A和B,A的routingKey是 *.user,B的routingKey是 #.user
routingKey 为:error.user 那么此时 2个队列都能接受到, 如果改为 user 那么这时候 只有B能接受到了。
headers:这个类型的交换机很少⽤到,他的路由规则 与routingKey⽆关 ⽽是通过判断header参数来识别的, 基本上没有应⽤场景,因为上⾯的三种类型已经能应付了。
RabbitMQ
MQ:即Message Queue(消息队列)。队列⼤家都知道,存放内容的⼀个东西,存放的内容先进先出,消息队列只是⾥⾯存放的内容是消息⽽已。
RabbitMQ是⼀个开源的基于AMQP协议实现的⼀个完整的企业级消息中间件,服务端语⾔由Erlang(⾯向并发编程)语⾔编写 对于⾼并发的处理有着天然的优势,客户端⽀持⾮常多的语⾔:
Python
ug数控编程软件下载Java
Ruby
PHP
C#
JavaScript
Go
Elixir
Objective-C
Swift
主流MQ对⽐
特性ActiveMQ RabbitMQ RocketMQ Kafka
单机吞吐量万级,⽐ RocketMQ、
Kafka 低⼀个数量级同 ActiveMQ10 万级,⽀撑⾼吞吐10 万级,⾼吞吐,⼀般配合
⼤数据类的系统来进⾏实时
数据计算、⽇志采集等场景
topic 数量对吞吐量的影响topic 可以达到⼏百/⼏千的级
别,吞吐量会有较⼩幅度的下
降,这是 RocketMQ 的⼀⼤
优势,在同等机器下,可以⽀
python入门教程网盘撑⼤量的 topic
topic 从⼏⼗到⼏百个时候,
吞吐量会⼤幅度下降,在同
等机器下,Kafka 尽量保证
topic 数量不要过多,如果要
⽀撑⼤规模的 topic,需要增
加更多的机器资源
时效性毫秒级微秒级,这是
RabbitMQ 的⼀⼤特
点,延迟最低
毫秒级毫秒级
可⽤性⾼,基于主从架构实现
⾼可⽤同 ActiveMQ⾮常⾼,分布式架构⾮常⾼,分布式,⼀个数据
多个副本,少数机器宕机,
不会丢失数据,不会导致不
可⽤
消息可靠性有较低的概率丢失数据经过参数优化配置,可以做到
0 丢失
同 RocketMQ
功能⽀持MQ 领域的功能极其完
备基于 erlang 开发,并
发能⼒很强,性能极
好,延时很低
MQ 功能较为完善,还是分布
record的汉语
式的,扩展性好
功能较为简单,主要⽀持简
单的 MQ 功能,在⼤数据领
域的实时计算以及⽇志采集
被⼤规模使⽤
RabbitMQ服务端部署
在介绍消息中间件的时候所提到的“消息系统” 便是我们这节的主题:RabbitMq 如同redis⼀样 他也是采⽤c/s架构 由服务端 与客户端组成, 我们现在我们计算机上部署他的服务端。由于我们刚刚介绍过了RabbitMQ服务端是由Erlang语⾔编写所以我们这⾥先下载Erlang 语⾔的环境。
注意:如果是在官⽹下的RabbitMQ服务端的话 Erlang语⾔的版本不能太低, 不然要卸载掉旧的去装新的, 我们这⾥下载OTP21.0版本直接从外⽹下载会很慢, 我这⾥直接贴上百度⽹盘的地址(因为这个东西还是有点⼤的)
我们再去官⽹下载 他的服务端安装包,根据⾃⼰的系统选择下载即可。
注意! 需要先下载Erlang再下载安装包安装, 不然安装RabbitMQ服务端的时候会提⽰你本地没有Erlang环境安装的话, 基本上就是默认的选项不⽤改。
如何看RabbitMq安装完成了? 在系统-服务中到如下即可:
包括启动 停⽌ 重启 服务等
RabbitMQ安装会附带⼀个管理⼯具(⽅便我们能直观的查看整个RabbitMQ的运⾏状态和详细数据等,有点像Navicat 对应Mysql的关系) 值得⼀提的是, 管理⼯具和RabbitMQ是两码事 希望同学们不要混稀了。
管理⼯具启动⽅式:
到你们安装的 RabbitMQ Server\rabbitmq_server-3.7.12\sbin ⽬录下⾯ 执⾏⼀条cmd命令:
rabbitmq-plugins enable rabbitmq_management
直接复制这条命令即可 , 当然 嫌每次都要去⽬录中去执⾏的⿇烦的话, 可以配置⼀个环境变量 或者在我们的开始菜单栏中到这个:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论