MQ学习1
MQ(bilibili)
MQ和RabbitMQ基础
1 什么是MQ
? 举例:用户注册
? 原来: 用户--短信服务--邮件服务--数据库
? 多线程:用户--短信(1秒)
? 用户--邮件(1秒)
? 用户--数据库(1秒)
? 消息队列:用户--数据库(1秒)
? 用户--消息队列(MQ)(0.5秒)
? 消息队列(MQ)--短信
? 消息队列(MQ)--邮件
- 传统模式:系统间耦合性太强,接入新的系统时,需要修改代码,过于麻烦;有一个功能出现问题的时候,整个大的功能都会受到影响;系统响应时间很长
- 多线程:耦合性降低,接入新系统时较容易,响应时间降低;但是,多线程会造成很多BUG,排查BUG困难,对程序员来说较为痛苦
- 消息队列:优点同上,而且,响应时间更快,还免去多线程的痛苦(相对多线程简单,快速)
-
进程间通信或同一进程的不同线程间的通信方式
-
通常来自用户
-
消息队列提供了异步的通信协议
-
消息的发送者和接收者不需要同时与消息队列交互,消息会保存在队列中,直到接受者取回它。
寄快递举例:发件人--生产者
? 收件人--消费者
? 快递员--MQ
? 包裹--消息
2 主流消息队列
- RabbitMQ
- RocketMQ
- ActiveMQ(较少)
- Kafka
- 部分数据库可实现消息队列功能:Redis、MySQL、phxSQL
3 特点
-
MQ是消费者-生产者模型的一个典型代表
-
一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。
-
MQ与JMS:类似但有区别
4 MQ与JMS
- JMS 是SUN JAVA的消息中间件服务的一个标准和API定义
- MQ是遵循了AMQP协议的具体实现和产品
- AMQP 是 : (高级的消息队列,是一个标准;RabbitMQ,RocketMQ,Kafka是基于这个标准的具体实现)
- AMQP的主要特征是:面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
- AMQP优点:不受客户端/中间件不同产品,不同的开发语言等条件的限制 (可以在不同语言进行开发)
- JMS 是 : JAVA消息服务,即Java Message Service 应用程序接口,是Java平台的API,只能用Java语言去实现
- 现在的主流MQ同时遵循了AMQP和JMS的标准。这两个并不冲突
5 MQ优缺点
5.1 优点:
? 应用解耦、异步处理、流量削峰
-
解耦:消息写入消息队列,需要消息的系统自己从消息队列中订阅,所以接入新系统时,不需要对原有代码逻辑进行修改
-
异步
-
削峰:传统模式在并发量大的时候,所有请求直接怼到数据库,造成数据库连接异常;MQ则是请求冲到消息队列进行排队,系统慢慢的按照业务规则(自己写的规则)从消息队列读取请求然后操作数据库,MQ所能承受的并发量远高于数据库
5.2 缺点
? 系统可用性降低、系统复杂性增加
? (需要考虑更多问题)
6 为什么选RabbitMQ
- ActiveMQ: 老牌MQ,各方面都很好,缺点是并发量不是特别高(可能出错)(不到2000)
- Kafka:与ActiveMQ相对应,主流MQ中并发量最高的,性能非常好(大数据方向基本都用Kafka),现在不学习原因:早期版本数据不严谨(多发,少发;日志无所谓漏发,Kafka设计意愿也是日志,但是订单交易等绝对不能用),后期已经修复
- RocketMQ:阿里巴巴开源的,设计时借鉴了Kafka的理念,速度快,修复了Kafka的早期错误,有新的自己的特性,开源,问题在于只开源部分功能(开源版VS正式版,部分功能需要阿里云购买)
- RabbitMQ:并发、处理速度略低于RocketMQ、Kafka,但是远高于ActiveMQ。(可以抗住双十一以下的高并发,如正常的秒杀等)。所有功能开源,真正开源,有很多插件(可以实现更多高级特性)
--RabbitMQ小总结
-
基于AMQP协议
-
高并发(一个容量概念,服务器可以接受的最大任务数量)
-
高性能(一个速度概念,单位时间内服务器可以处理的任务数)
-
高可用(一个持久概念,单位时间内服务器可以正常工作的时间比例)
-
强大的社区支持,很多公司都在用
-
支持插件
-
支持多语言,支持多种客户端
-
真正开源
-
其他:用Erlang语言编写,支持AJAX,用于在分布式系统中存储转发消息,易用性、扩展性、高可用性方面表现不俗
面试题:RabbitMQ为什么处理速度快?因为RabbitMQ是用Erlang语言编写的
(Erlang语言早期用于传统的拨号系统)
7 RabbitMQ
因为RabbitMQ是用Erlang语言编写的,所以安装RabbitMQ之前需要先安装Erlang语言环境
Erlang语言环境的版本与RabbitMQ版本有一定对应关系
7.1 安装
-
Erlang语言环境
-
RabbitMQ
-
RabbitMQ自带插件(类似 navicat 的可视化插件,RabbitMQ的是自带的且是网页版的):rabbitmq_management
-
启动rabbitmq服务 (broker指的就是mq服务器)
-
安装完成进入 http://127.0.0.1:15672/ (默认端口15672)
-
默认用户名/密码 guest/guest
-
默认只能本地登录,不能远程登录
-
远程登录方法:在rabbitmq配置文件目录下(默认/etc/rabbitmq)创建rabbitmq.config文件
-
文件中添加如下配置 [{rabbit,[{loopback_users,[]}]}]. (不要忽略最后的.)
-
重启rabbitmq服务
-
7.2 管控界面
-
rabbitmq版本,Erlang版本
-
每5秒自动刷新
-
虚拟主机(虚拟:逻辑上存在,可以用来区分不同的权限、不同的服务)默认有一个 /虚拟主机
-
集群 (或者虚拟机/计算机名字)
-
用户
-
第一个选项卡 Overview概览
- Queued messages 队列消息
- Currently idle 当前线程
- Global counts 全局数量
-
Nodes
- File descriptors 文件描述
- Socket descriptors Socket描述
- Erlang processes Erlang进程
- Memory 内存
- Disk space 磁盘空间
- Uptime 在线时间
- Info -- RabbitMQ消息默认存在disc(磁盘),可以修改存在内存 -- 开启插件数量 --内存策略rss
- Reset stats 重置
-
Churn statistics (连接、信道、队列的状态) -- 没找到
-
Ports and contexts 端口(仅有三个)
- amqp: java代码操作使用这个端口 默认端口号 5672
- http: 网页访问使用这个端口 默认端口号 15672
- clustering: 集群使用这个端口 默认端口号 25672
-
Export definitions 导出配置 使用场景:升级配置导出后导入到新的环境
-
Import definitions 导入配置
-
第二个选项卡 Connections连接
- 代码操作时可以看到连接,且需要是消费者启动时能看到连接,生产者启动时看不到,因为消费者启动后会阻塞在那里,而生产者执行后直接关闭了
-
第三个选项卡 Channels信道 由连接产生
-
第四个选项卡 Exchanges交换机
- 默认有交换机,按虚拟机产生(有一个虚拟机就有7个默认交换机)
-
第五个选项卡 Queues队列
-
第六个选项卡 Admin
-
Users 用户
-
Add a User新建用户
-
用户名、密码
-
Tags: 用户权限 Admin最高,None最低,逐级排列
- None
- Impersonator 演员 官网解释为 ???,并没有解释
- Management 能登录到管控界面 大部分权限没有
- Policymaker
- Monitoring
- Admin
-
Can access virtual hosts 能够接收的虚拟主机(默认什么都没有)
-
点击用户名可以设置权限 Set permission -- VirtualHost设置虚拟主机权限
-
Virtual Hosts 虚拟主机(显示名称、可访问用户、状态)可添加
-
guest拥有所有虚拟主机的权限
-
可以给用户设置可接受的虚拟主机,也可以给虚拟主机设置可以访问的用户
-
Feature Flags 特征
-
Cluster 集群 可以修改节点名
-
虚拟主机主要用来区分数据的间隔,物理分割