1.1.MQ相关概念:
a.什么是MQ
- 1.MQ
本质是个队列
,遵循FIFO先入先出
原则,过队列中存放的是message
- 2.MQ是跨进程的一
种通信机制
,用于上下游的消息传递
。消息发送上游
只需要依赖MQ,不需要依赖其他服务
b.MQ应用场景
b1.流量消峰
- 1.流量消峰:就是指的在流量高峰,当订单超过1万/s的时候,如果没有MQ来进行消息队列的缓冲,那么就会使得订单系统宕机,影响业务。所以使用MQ后,可以把
1秒内的订单分散成一段时间来处理
。这会使得用户在下单一段时间后才可以查到下单是否成功。
b2.应用解耦
- 1.在系统中,如果用户创建订单后,还要调用库存系统,物流系统,支付系统,那么任何一个子系统出现了故障,都会造成系统异常。
- 2.
当使用消息队列后
:系统间调用的问题会减少很多,比如物流系统因为发生故障,需要几分钟来修复。在这几分钟的时间里,物流系统要处理的内存被缓存在消息队列中
,用户的下单操作可以正常完成。 - 3.当物流系统恢复后,继续处理订单信息即可,其中用户感受不到物流系统的故障,提升系统的可用性。
b3.异步处理
- 1.有的服务间调用是异步的,例如 A 调用 B,B 需要花费很长时间执行,但是 A 需要知道 B 什么时候可以执行完;
- 2.上述这种情况,在以前一般有两种方式,A 过一段时间去调用 B 的查询 api 查询。或者 A 提供一个 callback api, B 执行完之后调用 api 通知 A 服务。这两种方式都不是很优雅;
- 3.我们使用
消息总线
,可以很方便解决这个问题,A 调用 B 服务后,只需要监听 B 处理完成的消息
,当 B 处理完成后,会发送一条消息给 MQ,MQ 会将此消息转发给 A 服务
。这样 A 服务既不用循环调用 B 的查询 api,也不用提供callback api。同样 B 服务也不用做这些操作。A 服务还能及时的得到异步处理成功的消息。
c.MQ的分类
c1.ActiveMQ
- ActiveMQ优点:
- 1.单机吞吐量万级,时效性 ms 级,可用性高,
基于主从架构实现高可用性
,较低的概率丢失数据
- 1.单机吞吐量万级,时效性 ms 级,可用性高,
- ActiveMQ缺点:
- 1.官方社区现在对 ActiveMQ 5.x 维护越来越少,
高吞吐量场景较少使用
。
- 1.官方社区现在对 ActiveMQ 5.x 维护越来越少,
c2.Kafka
- 1.简介 :
- .Kafka是一个数据的杀手锏,在大数据领域内的消息传输,则绕不开 Kafka,是一款大数据而生的消息中间件,以其
百万级 TPS 的吞吐量
而出名,在数据采集、传输、存储的
过程中有着重要作用。
- .Kafka是一个数据的杀手锏,在大数据领域内的消息传输,则绕不开 Kafka,是一款大数据而生的消息中间件,以其
- 2.优点:
- 性能卓越,
单机写入 TPS 约在百万条/秒
,最大的优点,就是`吞吐量高`` - 时效性 ms 级
可用性非常高,kafka 是
分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用,
消费者采用 Pull (推送)方式获取消息, 消息有序, 通
过控制能够保证所有消息被消费且`仅被消费一次; - 有优秀的第三方Kafka Web 管理界面 Kafka-Manager;在
日志领域成熟
,被多家公司和多个开源项目使用; - 功能支持:功能较为简单,主要支持简单的 MQ 功能,在大数据领域的
实时计算以及日志采集
被大规模使用;
- 性能卓越,
- 3.缺点:
- Kafka 单机超过 64 个队列/分区,Load 会发生明显的飙高(一般指的CPU)现象,队列越多,load 越高,发送消息响应时间变长
- 使用
短轮询方式,实时性取决于轮询间隔时间
,消费失败不支持重试,可能会导致消息丢失; - 支持消息顺序,但是一台代理宕机后,就会产生消息乱序,社区更新较慢;
c3.RocketMQ
- 1.简介:
- RocketMQ 是阿里巴巴的开源产品,用 Java 语言实现,在设计时参考了 Kafka,并做出了自己的一些改进。
- 被阿里巴巴广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog 分发等场景。
- 2.优点:
- 单机
吞吐量十万级
,可用性非常高,分布式架构,消息可以做到 0 丢失,MQ 功能较为完善,还是分布式的,扩展性好,支持 10 亿级别的消息堆积,不会因为堆积导致性能下降,源码是 java 我们可以自己阅读源码,定制自己公司的 MQ
- 单机
- 3.缺点:
- 支持的客户端语言不多,目前是 java 及 c++,其中 c++不成熟;
- 社区活跃度一般,没有在 MQ核心中去实现 JMS 等接口,有些系统要迁移需要修改大量代码。
c4.RabbitMQ
- 1.简介
- 2007 年发布,是一个在 AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。
- 2.优点:
- 由于 erlang 语言的高并发特性,性能较好;吞吐量到万级,MQ 功能比较完备,健壮、稳定、易用、跨平台、支持多种语言 如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,`支持 AJAX
- 3.
文档齐全
;- 开源提供的管理界面非常棒,用起来很好用,社区活跃度高;更新频率相当高
- 4.缺点:
- 商业版需要收费,学习成本较高
d.MQ的选择
d1.Kafka
- Kafka 主要特点是基于
Pull 的模式来处理消息
消费,追求高吞吐量
, - Kafka 一开始的目的就是用于日志收集和传输,适合产生大量数据的互联网服务的数据收集业务。
- 大型公司建议可以选用,如果有日志采集功能,肯定是首选 kafka 了。
d2.RocketMQ
- 1.天生为
金融互联网领域
而生,对于可靠性要求很高的场景,尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入时,后端可能无法及时处理的情况。RoketMQ - 2.在稳定性上可能更值得信赖,这些场景在阿里双 11 已经经历了多次考验,所以当业务上有并发场景,可以选择使RocketMQ。
d3.RabbitMQ
- 结合 erlang 语言本身的并发优势,性能好时效性微秒级,社区活跃度也比较高,管理界面用起来十分方便,如果你的数据量没有那么大,中小型公司优先选择功能比较完备的
1.2.RabbitMQ:
a.RabbitMQ概念:
- 1.RabbitMQ是一个消息中间件,他负责的是
接收,存储并转发
消息
b.RabbitMQ的四大核心概念:
生产者
:- 产生数据,发送消息的程序是生产者
交换机
:- 交换机
一边接受来自生产者的消息,一边将消息推送到队列中
; - 交换机必须准确知道如何处理接受到的消息,到底是把消息推送到特定队列还是推送到多个队列或者还是把消息丢弃。这个是
由交换机类型决定
。
- 交换机
队列
:- 对列的
本质是一个消息缓冲区
- 队列仅仅受主机内存与磁盘的约束;
- 许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据
- 对列的
消费者
:- 消费与接收具有相似的含义。
- 消费者大多时候是一个等待接收消息的程序;
- 注意
生产者,消费者和消息中间件很多时候并不在同一机器上
; - 同一个应用程序既可以是生产者又是可以是消费者。
c.RabbitMQ核心部分(6大模式):
- 1.简单模式:
- 2.工作模式:
- 3.发布订阅模式:
- 4.路由模式:
- 5.主题模式:
- 6.发布确认模式:
d.RabbitMQ中各个名词解释:
Broker
:- 接收和分发消息的应用,RabbitMQ Server 就是 Message Broker
Virtual host
:- 出于多租户和安全因素设计的,所谓的多租户就是:一个Broker中可以含有多个
Virtual host
,一个Virtual host中就又含有多个交换机和信道channel。 - 当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个 vhost,每个用户在自己的 vhost 创建 exchange/queue 等
- 出于多租户和安全因素设计的,所谓的多租户就是:一个Broker中可以含有多个
Connection
:- publisher/consumer 和 broker 之间的 TCP 连接
Channel
:- 如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP
Connection
的开销将是巨大的,效率也较低。 - Channel 是在 connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个 thread 创建单独的 channel 进行通讯,AMQP method 包含了 channel id 帮助客户端和 message broker 识别 channel,所以 channel 之间是完全隔离的。
Channel 作为轻量级的 Connection 极大减少了操作系统建立 TCP connection 的开销
- 如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP
Exchange
:- message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到 queue 中去。常用的类型有:
direct (point-to-point), topic (publish-subscribe) and fanout (multicast)
- message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到 queue 中去。常用的类型有:
Queue
:- 消息最终被送到这里等待 consumer 取走
Binding
:- exchange 和 queue 之间的虚拟连接,binding 中可以包含 routing key,Binding 信息被保存到 exchange 中的查询表中,用于 message 的分发依据
d.RabbitMQ 安装
d1.docker安装:
- 1.在我的docker学习笔记中具有详细的安装过程
d2.rpm包方式安装:
- 1.MQ下载地址
- 2.
这里是提前下载好后上传安装包到服务器得opt目录下:
- 3.安装MQ需要先有Erlang语言环境,安装文件的Linux命令(分别按照以下顺序安装)
rpm -ivh erlang-21.3-1.el7.x86_64.rpm # i的意思就是安装的意思,vh意思就是显示安装进度
yum install socat -y #(这个是安装需要的依赖,需要在连接网络下进行安装)
rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm
- 4.常用的命令
- 添加开机启动 RabbitMQ 服务:
chkconfig rabbitmq-server on
- 启动RabbitMQ服务:
/sbin/service rabbitmq-server start
- 查看服务状态:
/sbin/service rabbitmq-server status
- 停止服务(选择执行):
/sbin/service rabbitmq-server stop
- 添加开机启动 RabbitMQ 服务:
- 5.给Rabbitmq安装Web界面插件:
rabbitmq-plugins enable rabbitmq_management
-
6.插件安装完毕后,可以登录管理平台MQ管理平台,
-
7.在登录之前一定要再重启服务,且关闭防火墙
查看防火墙状态:systemctl status firewalld
关闭防火墙:systemctl stop firewalld
- 开机不自动启动防火墙:
systemctl enable firewalld
-
8.浏览器访问MQ管理平台:
http://192.168.148.3:15672
-
9.Rabbitmq添加一个用户
- 添加一个新的用户以便登录后台管理系统
- 创建账号:
rabbitmqctl add_user admin 123
账号和密码是:admin和密码123 - 设置用户角色:
rabbitmqctl set_user_tags admin administrator
- 设置用户权限:
set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
;比如: rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
- 用户 user_admin 具有/vhost1 这个 virtual host 中所有资源的配置、写、读权限
- 当前用户和角色:
rabbitmqctl list_users