RabbitMq系列:安装与基本概念
一、简介
电商场景为例,如果商品服务和订单服务是两个不同的微服务,在下单的过程中订单服务需要调用商品服务
进行扣库存操作。
传统的方式,下单过程要等到调用完毕之后才能返回下单成功,如果网络产生波动等原因使得商品服务扣库
存延迟或者失败,会带来较差的用户体验,如果在高并发的场景下,这样的处理显然是不合适的.
消息队列提供一个异步通信机制,消息的发送者不必一直等待到消息被成功处理才返回,而是立即返回.
消息中间件负责处理网络通信,如果网络连接不可用,消息被暂存于队列当中,当网络畅通的时候再将消息
转发给相应的应用程序或者服务,前提是这些服务订阅了该队列.
如果在商品服务和订单服务之间使用消息中间件,既可以提高并发量,又降低服务之间的耦合度.
RabbitMQ是基于AMQP协议使用Erlang语言来编写的开源的消息代理的队列服务器.
二、应用场景
异步处理:把消息放入消息中间件中,等到需要的时候再去处理。
流量削峰:例如秒杀活动,短时间内访问量急增,使用消息队列,当消息队列满了就拒绝响应,跳转到错误页面,这样就可以使得系统不会因为超负载而崩溃。
应用解耦:
三、重要概念
VHost : 每一个RabbitMQ服务器都能创建虚拟消息服务器,我们称之为虚拟主机。每一个vhost本质上是一个mini版的
RabbitMQ服务器,拥有自己的交换机、队列、绑定等,拥有自己的权限机制。RabbitMQ提供了开箱即用的默认的虚拟主
机“/”,如果不需要多个vhost可以直接使用这个默认的vhost,通过使用缺省的guest用户名和guest密码来访问默认的
vhost。vhost之间是相互独立的,这避免了各种命名的冲突,就像App中的沙盒的概念一样,每个沙盒是相互独立的,且只
能访问自己的沙盒,以保证非法访问别的沙盒带来的安全隐患。
Producer:消息的发布者,相当于淘宝卖家
Consumer:消息的接收者,相当于淘宝买家
Broker:可以看做一个RabbitMQ服务实例
Server:接收客户端的连接,实现AMQP实体服务
Connection:就是一个TCP的连接。Producer和Consumer都是通过TCP连接到RabbitMQ Server的。
相当于卖家和快递公司建立合作协议;
Channel:信道,消息读写等操作在信道中进行。客户端可以建立多个信道,每个信道代表一个会话任务。它建
立在上述的TCP连接中。建立和关闭TCP连接耗资源,影响性能,而且TCP的连接数也有限制,限制了系统处理高
并发的能力。但是,在TCP连接中建立Channel是没有上述代价的。对于Producer或者Consumer来说,可以并发
的使用多个Channel进行Publish或者Receive.
Message:消息,应用程序和服务器之间传送的数据,消息可以非常简单,也可以很复杂。由Properties和Body组成。
Properties为外包装,可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body就是消息体内容。
Queue:消息队列,用于缓存消息,Consumer和Procuder都可以创建queue,队列的持久化也可以设置;相
当于快递的集散中心,用来暂时存放快递;消费者从队列中取消息;相当于买家从集散中心取快递,多个买家可
以从同一个集散中心取快递;相当于多个客户端从队列里取消息;一个客户端也可以创建多个通道从队列里取消
息,相当于一个家庭的不同成员去取快递; 程序中就是开启多个线程,通过通道从队列中取消息,实现高并发
Exchange:交换器,接收消息,按照路由规则将消息路由到一个或者多个队列。如果路由不到,或者返回给生产
者,或者直接丢弃。相当于快递公司,将接到的快递集散之后发给各个城市的集散中心;RabbitMQ常用的交换器
常用类型有direct、topic、fanout、headers四种。定向模式Direct exchange,只有当routing key 匹配
时, 消息才会被传递到相应的queue中;广播模式Fanout exchange, 会向所有绑定的队列发送消息;模糊匹配
模式Topic exchange,routing key由通配符构成,对routing key进行模式匹配,比如ab*可以传递到所有
ab*的queue。
RoutingKey:路由键,生产者将消息发送给交换器的时候,会发送一个RoutingKey,用来指定路由规则,这样
交换器就知道把消息发送到哪个队列。用来连接Exchange和queue,路由键通常为一个“.”分割的字符串,例
如“com.rabbitmq”。相当于快递中的地址,让快递公司知道将快递发给哪个集散中心;
Binding:绑定exchange和queue之间的虚拟连接,绑定中可以包含一个或者多个RoutingKey。
exchange交换机负责接收消息,决定将消息发送到哪个队列queue中
queue队列存储消息
consumer 1个客户端只会建立一条长连接,但是一个长连接包含多个信道Channel
一个exchange交换机可以绑定多个queue
一个queue队列可以由多个exchange交换机绑定
exchange交换机类型:direct直接 header fanout扇出 topic主题
direct exchange: 直接交给指定的队列 routing-key精准匹配
fanout exchange: 扇出,不关心routing-key,广播模式。exchange将消息发送给全部绑定的queue
topic exchange: 主题,关心routing-key,也是广播发送给多个queue,但是发送给特定的queue
四、安装
##采用Docker安装:
1、查看仓库rabbitmq镜像是否存在 management版本是带有控制台的,否则还要自己开启
docker search rabbitmq:management
2、下载镜像
docker pull rabbitmq:management
3、发布
docker run -d --name rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin123 -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 rabbitmq:management
##控制台的账号和密码,如果不设置的话,默认账号和密码是:guest guest
##账号:RABBITMQ_DEFAULT_USER=admin
##密码:RABBITMQ_DEFAULT_PASS=admin123
##端口描述
##4369 erlang发现口
##5672 client端通信口
##15672 管理界面UI端口
##25672 server端内部通信口
##61613 STOMP插件启用
##1883/8883 当MQTT插件启用的时候打开
##15674 基于websocket的STOMP客户端端口
##15674 基于websocket的MQTT客户端端口
##如果没有management控制台,可以开启:
##docker ps
##docker exec -it 镜像ID /bin/bash
##rabbitmq-plugins enable rabbitmq_management
4、访问管理系统界面,账号和密码为步骤3设置的admin admin123/没有设置的话默认是guest guest
http://服务器地址:15672