本文概述
一、概述
1.MQ是什么?
(1) 概述
消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴自主开发RocketMQ等。
(2) 消息中间件的组成
2.1 Broker
消息服务器,作为server提供消息核心服务
2.2 Producer
消息生产者,业务的发起方,负责生产消息传输给broker,
2.3 Consumer
消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理
2.4 Queue
队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收
2.5 Message
消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输
(3) 消息中间件的优势
3.1 系统解耦
交互系统之间没有直接的调用关系,只是通过消息传输,故系统侵入性不强,耦合度低。
3.2 异步操作-提高系统响应时间
例如原来的一套逻辑,完成支付可能涉及先修改订单状态、计算会员积分、通知物流配送几个逻辑才能完成;通过MQ架构设计,就可将紧急重要(需要立刻响应)的业务放到该调用方法中,响应要求不高的使用消息队列,放到MQ队列中,供消费者处理。
3.3 流量削峰
当我们进行秒杀等高并发的业务时,瞬时并发量特别大,容易冲击我们的后台服务,我们就可以使用MQ,实现流量削峰,将请求放入队列,减缓我们的后台服务器压力.
(4) 消息中间件常用协议
4.1 AMQP协议
AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。
优点:可靠、通用
4.2 MQTT协议
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。
优点:格式简洁、占用带宽小、移动端通信、PUSH、嵌入式系统
4.3 STOMP协议
STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。STOMP提供一个可互操作的连接格式,允许客户端与任意STOMP消息代理(Broker)进行交互。
优点:命令模式(非topic\queue模式)
4.4 XMPP协议
XMPP(可扩展消息处理现场协议,Extensible Messaging and Presence Protocol)是基于可扩展标记语言(XML)的协议,多用于即时消息(IM)以及在线现场探测。适用于服务器之间的准即时操作。核心是基于XML流传输,这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同。
优点:通用公开、兼容性强、可扩展、安全性高,但XML编码格式占用带宽大
4.5 其他基于TCP/IP自定义的协议
有些特殊框架(如:redis、kafka、zeroMq等)根据自身需要未严格遵循MQ规范,而是基于TCP\IP自行封装了一套协议,通过网络socket接口进行传输,实现了MQ的功能。
(5)常见消息中间件MQ介绍
5.1 RocketMQ
阿里系下开源的一款分布式、队列模型的消息中间件,原名Metaq,3.0版本名称改为RocketMQ,是阿里参照kafka设计思想使用java实现的一套mq。同时将阿里系内部多款mq产品(Notify、metaq)进行整合,只维护核心功能,去除了所有其他运行时依赖,保证核心功能最简化,在此基础上配合阿里上述其他开源产品实现不同场景下mq的架构,目前主要多用于订单交易系统。
具有以下特点:
- 能够保证严格的消息顺序
- 提供针对消息的过滤功能
- 提供丰富的消息拉取模式
- 高效的订阅者水平扩展能力
- 实时的消息订阅机制
- 亿级消息堆积能力
官方提供了一些不同于kafka的对比差异:
https://rocketmq.apache.org/docs/motivation/
5.2 RabbitMQ
使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP,STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。同时实现了Broker架构,核心思想是生产者不会将消息直接发送给队列,消息在发送给客户端时先在中心队列排队。对路由(Routing),负载均衡(Load balance)、数据持久化都有很好的支持。多用于进行企业级的ESB整合。
5.3 ActiveMQ
Apache下的一个子项目。使用Java完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,少量代码就可以高效地实现高级应用场景。可插拔的传输协议支持,比如:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports。RabbitMQ、ZeroMQ、ActiveMQ均支持常用的多种语言客户端 C++、Java、.Net,、Python、 Php、 Ruby等。
5.4 Redis
使用C语言开发的一个Key-Value的NoSQL数据库,开发维护很活跃,虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。
5.5 Kafka
Apache下的一个子项目,使用scala实现的一个高性能分布式Publish/Subscribe消息队列系统,具有以下特性:
-
快速持久化:通过磁盘顺序读写与零拷贝机制,可以在O(1)的系统开销下进行消息持久化;
-
高吞吐:在一台普通的服务器上既可以达到10W/s的吞吐速率;
-
高堆积:支持topic下消费者较长时间离线,消息堆积量大;
-
完全的分布式系统:Broker、Producer、Consumer都原生自动支持分布式,依赖zookeeper自动实现复杂均衡;
-
支持Hadoop数据并行加载:对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。
2.rabbitMQ的概述.
(1)什么是RabbitMQ?
RabbitMQ是由Erlang语言编写的实现了高级消息队列协议(AMQP)的开源消息代理软件(也可称为 面向消息的中间件)。支持Windows、Linux/Unix、MAC OS X操作系统和包括JAVA在内的多种编程语言。
(2)RabbitMQ的架构
- Broker: 消息队列服务进程,此进程两个部分:Exchange和queue
- Exchange: 消息队列的交换机,按照一定的规则转发到queue中去.
- Queue: 消息队列,消息存放的队列
- Producer: 消息生产者
- Consumer: 消息的消费者
- Channel:消息通道,也称信道。在客户端的每个连接里可以建立多个Channel,每个Channel代表一个会话任务。
二、rabbitMQ的下载/安装
在windows上安装rabbitMQ的流程:
1.下载/安装erlang语言
因为rabbitMq是erlang开发的,所以我们需要erlang的运行环境,需要下载安装erlang语言.
1.1 下载erlang语言包
直接在官网去下载即可.
1.2 安装erlang语言
安装过程中,直接下一步即可
1.3 配置erlang语言的环境变量
2.下载/安装rabbitMQ
2.1 下载
下载地址:https://www.rabbitmq.com/download.html
2.2 安装
安装过程直接,下一步即可
3.安装管理界面的插件
在cmd窗口,rabbitMQ的sbin目录执行以下命令:
rabbitmq-plugins enable rabbitmq_management
4.检测是否安装成功
4.1 检测rabbitMQ服务是否安装好
4.2 检查管理页面的插件是否安装好
5.rabbitMQ的命令
rabbitmq启动方式有2种
(1) 以应用方式启动
- rabbitmq-server -detached 后台启动
- Rabbitmq-server 直接启动,如果你关闭窗口或者需要在改窗口使用其他命令时应用就会停止
- 关闭:rabbitmqctl stop
(2) 以服务方式启动(安装完之后在任务管理器中服务一栏能看到RabbtiMq)
- rabbitmq-service install 安装服务
- rabbitmq-service start 开始服务
- Rabbitmq-service stop 停止服务
- Rabbitmq-service enable 使服务有效
- Rabbitmq-service disable 使服务无效
- rabbitmq-service help 帮助
当rabbitmq-service install之后默认服务是enable的,如果这时设置服务为disable的话,rabbitmq-service start就会报错。
当rabbitmq-service start正常启动服务之后,使用disable是没有效果的
关闭:rabbitmqctl stop
(3) Rabbitmq 管理插件启动,可视化界面
- rabbitmq-plugins enable rabbitmq_management 启动
- rabbitmq-plugins disable rabbitmq_management 关闭
(4) Rabbitmq节点管理方式
- Rabbitmqctl
三、rabbitMQ的管理界面介绍
1.登陆界面: localhost:15672
默认的用户名和密码:
guest/guest
2.主界面介绍
3.帮助界面(在每一页的最下边)
特别是教程,非常有用
点击上面的 tutorials,跳转到教程页面
本教程详细列出了rabbitMQ的各种语言的API,以及demo
(4)主界面的介绍
- Overview(概览)
- Connection(显示当前的连接)
- Channel(当前连接的通道)
- Exchange(当前所有的交换机)
- Queue(所有的队列)
- admin(用户及权限)
1.添加用户
2.设置新的虚拟机
3.用户绑定权限到新的虚拟机
(1)点击我们创建的新用户
(2)设置用户权限