什么是MQ?
MQ 全程 Message Queue 消息队列,message是消息,queue是容器,消息队列就是传输过程中保存消息的容器。多用于分布式系统之间进行通信。
直接通信, A系统(生产者) -> MQ(中间件) -> B系统(消费者)
MQ的优势
1.应用解耦:高内聚 低耦合,使用MQ让应用程序解耦
2.异步提速:用户体验好,响应及时。订单系统调用完成后 还要去调用物流系统 再返回给客户说下单成功了,调用完系统后把物流消息放到MQ,稍后MQ会自动消费消息给物流系统。
3.削峰填谷:秒杀 直接访问系统并发量太高容易直接崩溃, 这时可以放到MQ去排队处理,系统再去慢慢消费。
MQ的劣势
1.系统可用性降低:系统引用的外部依赖越多,系统稳定性越差。因为本来系统挂了程序就挂了,现在如果中间件挂了 系统也挂了。
2.系统的复杂度提高:A系统直接调用B系统 简单方便,A系统->MQ->B系统,消息的顺序,是否丢失,是否重复消费 复杂度提高了。
3.一致性问题:A系统处理完毕后给B系统C系统D系统发送消息,如果BC成功了,D失败了 数据不一致的问题。
使用MQ的条件
1.生产者不需要从消费者获取反馈,同步处理。
2.允许数据短暂的不一致性
3.解耦、异步提速、削峰填谷确实需要这些
什么是RabbitMQ?
RabbitMQ是由Erlang语言编写的基于AMQP协议的消息队列产品。支持WIndows、Linux、MAC OS 操作系统和包括java、.net在内的多种编程语言。
AMQP,即Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受 客户端/中间件不同产品,不同的开发语言等条件的限制。
基础架构如下:
Producer:消息生产者。
Connection:producer、broker、consumer 之间的TCP链接
Channel:消息通道,也称信道。channel作为轻量级的connection极大减少了操作系统建立TCP 链接的开销
Broker:接收和分发消息的应用,RabbitMQ Server就是 Message Broker。
Virtual Host:虚拟主机。一个Broker可以有多个虚拟主机,用作不同用户的权限分离。一个虚拟主机持有一组Exchange、Queue和Bingding。
Exchange:消息交换机。指定消息按照什么规则路由到哪个队列Queue。
Binding:绑定。作用就是将Exchange和Queue按照某种路由规则绑定起来。
RoutingKey:路由关键字。Exchange根据RoutingKey进行消息传递。
Queue:消息队列。消息的载体,每条消息都会被投送到一个或多个队列中。
Consumer:消息消费者。消息的接收者。
RabbitMQ工作模式:简单模式、work queues、publishsubscribe发布与订阅模式、routing路由模式、topics主题模式、RPC远程模式(不太算MQ)。
RabbitMQ使用流程
AMQP模型中,消息在producer中产生,发送到MQ的exchange上,exchange根据配置的路由方式投递到相应的Queue上,Queue又将消息发送给已经在此Queue上注册的consumer,消息从queue到consumer有push和pull两种方式。
1.客户端连接到消息队列服务器,打开一个channel。
2.客户端声明一个exchange,并设置相关属性。
3.客户端声明一个queue,并设置相关属性。
4.客户端使用routing key,在exchange和queue质检建立好binding关系。
5.生产者客户端投递消息到exchange。
6.exchange接收到消息后,就根据消息的RoutingKey和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。
7.消费者客户端从对应的队列中获取并处理消息。
RabbitMQ的优缺点:
优点:
1.由Erlang语言开发,支持大量协议:AMQP、XMPP、SMTP、STOMP。
2.支持消息的持久化,负载均衡和集群,且集群易扩展。
3.具有一个Web监控界面,易于管理。
4.安装部署简单,上手容易,功能丰富,强大的社区支持。
5.支持消息确认机制、灵活的消息分发机制。
缺点:
1.由于牺牲了部分性能来换取稳定性,比如消息的持久化功能,使得RabbitMQ在大吞吐量性能方面不及Kafka和ZeroMQ。
2.由于支持多种协议,使RabbitMq非常重量级,比较适合企业级开发。
因此,当需要一个稳定的、高可考性的、功能强大易于管理的消息队列可以选择RabbitMQ。如果对消息吞吐量需求较大,切不在乎消息偶尔丢失的情况可以使用Kafka。
安装RabbitMQ
linux版:
https://www.rabbitmq.com/download.html
1、RabbitMQ是Erlang编写的,Erlang环境需要安装,注意Erlang版本需要和RabbitMQ匹配 https://www.rabbitmq.com/which-erlang.html
Erlang下载地址:https://www.rabbitmq.com/releases/erlang/
如:erlang-18.3-1.el7.centos.x86_64.rpm
2、下载RabbitMQ的安装包
RabbiMQ下载地址:https://www.rabbitmq.com/releases/rabbitmq-server/
如:rabbitmq-server-3.6.3-1.noarch.rpm
3、RabbitMQ依赖于socat
下载地址:http://repo.iotti.biz/CentOS/ 根据自身系统选择
如:socat-1.7.3.2-5.el7.lux.x86_64.rpm
开始安装:
上传到 /usr/local/rabbitMQ 文件夹 依次安装 顺序要对
1.rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm
2.rpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpm
3.rpm -ivh rabbitmq-server-3.6.3-1.noarch.rpm
修改配置文件:
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.3/ebin/rabbit.app
loopback_users 改为 [guest]
启用管理插件:
rabbitmq-plugins enable rabbitmq_management
启动rabbitmq:
cd /usr/lib/rabbitmq/bin
./rabbitmq-server start
打开端口:
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --reload
http://10.211.55.4:15672/ 访问管理页面
mac版:
官方地址:https://www.rabbitmq.com/install-homebrew.html
首先 安装 homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
然后使用brew命令安装即可
brew install rabbitmq
安装目录:/usr/local/cellar/rabbitmq/3.7.5
启动RabbitMQ
进入到安装目录 /usr/local/cellar/rabbitmq/3.7.5 执行
sbin/rabbitmq-server
启动插件
启动完毕之后,另起一个终端 进入/usr/local/cellar/rabbitmq/3.7.5/sbin
./rabbitmq-plugins enable rabbitmq_management(执行一次以后不用再次执行)
登陆管理界面
http://localhost:15672/
账号密码都是guest
rabbitMQ常用命令
启动监控管理器:rabbitmq-plugins enable rabbitmq_management
关闭监控管理器:rabbitmq-plugins disable rabbitmq_management
启动rabbitmq:rabbitmq-service start
关闭rabbitmq:rabbitmq-service stop
查看所有的队列:rabbitmqctl list_queues
清除所有的队列:rabbitmqctl reset
关闭应用:rabbitmqctl stop_app
启动应用:rabbitmqctl start_app
用户和权限设置
添加用户:rabbitmqctl add_user username password
分配角色:rabbitmqctl set_user_tags username administrator
新增虚拟主机:rabbitmqctl add_vhost vhost_name
将新虚拟主机授权给新用户:rabbitmqctl set_permissions -p vhost_name username '.*' '.*' '.*'
角色说明
none 最小权限角色
management 管理员角色
policymaker 决策者
monitoring 监控
administrator 超级管理员