MQ学习1


MQ(bilibili)

MQ和RabbitMQ基础

1 什么是MQ

? 举例:用户注册

? 原来: 用户--短信服务--邮件服务--数据库

? 多线程:用户--短信(1秒)

? 用户--邮件(1秒)

? 用户--数据库(1秒)

? 消息队列:用户--数据库(1秒)

? 用户--消息队列(MQ)(0.5秒)

? 消息队列(MQ)--短信

? 消息队列(MQ)--邮件

  • 传统模式:系统间耦合性太强,接入新的系统时,需要修改代码,过于麻烦;有一个功能出现问题的时候,整个大的功能都会受到影响;系统响应时间很长
  • 多线程:耦合性降低,接入新系统时较容易,响应时间降低;但是,多线程会造成很多BUG,排查BUG困难,对程序员来说较为痛苦
  • 消息队列:优点同上,而且,响应时间更快,还免去多线程的痛苦(相对多线程简单,快速)
  1. 进程间通信或同一进程的不同线程间的通信方式

  2. 通常来自用户

  3. 消息队列提供了异步的通信协议

  4. 消息的发送者和接收者不需要同时与消息队列交互,消息会保存在队列中,直到接受者取回它。

寄快递举例:发件人--生产者

? 收件人--消费者

? 快递员--MQ

? 包裹--消息

2 主流消息队列

  • RabbitMQ
  • RocketMQ
  • ActiveMQ(较少)
  • Kafka
  • 部分数据库可实现消息队列功能:Redis、MySQL、phxSQL

3 特点

  • MQ是消费者-生产者模型的一个典型代表

  • 一端往消息队列中不断写入消息,而另一端则可以读取或者订阅队列中的消息。

  • MQ与JMS:类似但有区别

4 MQ与JMS

  1. JMS 是SUN JAVA的消息中间件服务的一个标准和API定义
  2. MQ是遵循了AMQP协议的具体实现和产品
  3. AMQP 是 : (高级的消息队列,是一个标准;RabbitMQ,RocketMQ,Kafka是基于这个标准的具体实现)
  4. AMQP的主要特征是:面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
  5. AMQP优点:不受客户端/中间件不同产品,不同的开发语言等条件的限制 (可以在不同语言进行开发)
  6. JMS 是 : JAVA消息服务,即Java Message Service 应用程序接口,是Java平台的API,只能用Java语言去实现
  7. 现在的主流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小总结

  1. 基于AMQP协议

  2. 高并发(一个容量概念,服务器可以接受的最大任务数量)

  3. 高性能(一个速度概念,单位时间内服务器可以处理的任务数)

  4. 高可用(一个持久概念,单位时间内服务器可以正常工作的时间比例)

  5. 强大的社区支持,很多公司都在用

  6. 支持插件

  7. 支持多语言,支持多种客户端

  8. 真正开源

  9. 其他:用Erlang语言编写,支持AJAX,用于在分布式系统中存储转发消息,易用性、扩展性、高可用性方面表现不俗

面试题:RabbitMQ为什么处理速度快?因为RabbitMQ是用Erlang语言编写的

(Erlang语言早期用于传统的拨号系统)

7 RabbitMQ

因为RabbitMQ是用Erlang语言编写的,所以安装RabbitMQ之前需要先安装Erlang语言环境

Erlang语言环境的版本与RabbitMQ版本有一定对应关系

7.1 安装

  1. Erlang语言环境

  2. RabbitMQ

  3. RabbitMQ自带插件(类似 navicat 的可视化插件,RabbitMQ的是自带的且是网页版的):rabbitmq_management

  4. 启动rabbitmq服务 (broker指的就是mq服务器)

  5. 安装完成进入 http://127.0.0.1:15672/ (默认端口15672)

  6. 默认用户名/密码 guest/guest

    • 默认只能本地登录,不能远程登录

    • 远程登录方法:在rabbitmq配置文件目录下(默认/etc/rabbitmq)创建rabbitmq.config文件

    • 文件中添加如下配置 [{rabbit,[{loopback_users,[]}]}]. (不要忽略最后的.)

    • 重启rabbitmq服务

7.2 管控界面

  1. rabbitmq版本,Erlang版本

  2. 每5秒自动刷新

  3. 虚拟主机(虚拟:逻辑上存在,可以用来区分不同的权限、不同的服务)默认有一个 /虚拟主机

  4. 集群 (或者虚拟机/计算机名字)

  5. 用户

  6. 第一个选项卡 Overview概览

    • Queued messages 队列消息
    • Currently idle 当前线程
    • Global counts 全局数量
  7. Nodes

    • File descriptors 文件描述
    • Socket descriptors Socket描述
    • Erlang processes Erlang进程
    • Memory 内存
    • Disk space 磁盘空间
    • Uptime 在线时间
    • Info -- RabbitMQ消息默认存在disc(磁盘),可以修改存在内存 -- 开启插件数量 --内存策略rss
    • Reset stats 重置
  8. Churn statistics (连接、信道、队列的状态) -- 没找到

  9. Ports and contexts 端口(仅有三个)

    • amqp: java代码操作使用这个端口 默认端口号 5672
    • http: 网页访问使用这个端口 默认端口号 15672
    • clustering: 集群使用这个端口 默认端口号 25672
  10. Export definitions 导出配置 使用场景:升级配置导出后导入到新的环境

  11. Import definitions 导入配置

  12. 第二个选项卡 Connections连接

    • 代码操作时可以看到连接,且需要是消费者启动时能看到连接,生产者启动时看不到,因为消费者启动后会阻塞在那里,而生产者执行后直接关闭了
  13. 第三个选项卡 Channels信道 由连接产生

  14. 第四个选项卡 Exchanges交换机

    • 默认有交换机,按虚拟机产生(有一个虚拟机就有7个默认交换机)
  15. 第五个选项卡 Queues队列

  16. 第六个选项卡 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 集群 可以修改节点名

虚拟主机主要用来区分数据的间隔,物理分割