一、MQ
1. MQ定义
MQ(Message Queue):翻译为消息队列,典型的生产者和消费者模型,生产者不断向消息队列中生产消息,消费者不断从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,轻松实现系统间的解耦。
别名为消息中间件,统过利用高校可靠的消息机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。
2. MQ都有哪些
主流的消息中间件,如传统的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴的RocketMQ等。
3. 不同MQ的特点
# ActiveMQ:ActiveMQ是Apache出品,最流行、能力强劲的开源消息总线。是一个完全支持JMS规范的消息中间件。丰富的API,多种集群架构模式让AcitveMQ在业界成为老牌的消息中间件。
# Kafka:Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是基于pull的模式来处理消息消费,追求高吞吐量,目的主要用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求。
# RocketMQ:RocketMQ是阿里开源的消息中间件,是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但是并不是Kafka的copy,它对消息的可靠传输及事务性做了优化。
# RabbitMQ:RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用于在企业系统内对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
*** RabiitMQ比Kafka可靠,Kafka更适合IO高吞吐量的处理,一般用于大数据日志处理或对实时性、可靠性要求稍低的场景使用,比如ELK日志收集。
二、RabbitMQ
基于AMQP协议,erlang语言开发,是部署最广泛的开源消息中间件,是最受欢迎的开源消息中间件之一。
三、AMQP
1. 定义
AMQP协议:AMQP(advanced message queuing protocol)在2003年被提出,最早用于解决金融领域不同平台之间的消息传递交互问题。顾名思义,AMQP是一种协议,更准确的说是一种binary wirelevel protocol(链接协议)。这是其和JMS的本质区别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式,这使得实现了AMQP的provider天然性就是跨平台的。
2. AMQP协议模型
# Server:接收和分发消息的应用。
# Virtual host:出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念。当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建 exchange/queue等。
# Connection:publisher/consumer 和server之间的TCP连接。断开连接的操作只会在client端进行,server不会断开连接,除非出现网络故障或server服务出现问题。
# Channel:如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低。Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id帮助客户端和message server识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。
# Exchange:message到达server的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)。
# Queue:消息最终被送到这里等待consumer取走。一个message可以被同时拷贝到多个queue中。
# Binding:exchange和queue之间的虚拟连接,binding中可以包含routing key。Binding信息被保存到exchange中的查询表中,用于message的分发依据。
四:RabbitMQ安装
官网现在地址:https://www.rabbitmq.com/download.html
还需下载erlang依赖包。
*** centos7的安装包
1. 安装步骤
# 将rabbitmq的安装包上传到linux系统中
# 安装erlang依赖包
rpm -ivh erlang-22.0.7-1.el7.x86_64.rpm
# 安装内存管理依赖
rpm -ivh socat-1.7.3.2-2.el7.x86_64.rpm
# 安装rabbitmq安装包
rpm -ivh rabbitmq-server-3.7.18-1.el7.noarch.rpm
** 默认安装完成后配置文件模板在:/usr/share/doc/rabbitmq-3.7.18/rabbitmq.config.example目录中,需要将配置文件复制到/etc/rabbitmq/目录中,并修改名称为rabbitmq.config
# 复制配置文件
cp /usr/share/doc/rabbitmq-3.7.18/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
# 修改配置文件
vi /etc/rabbitmq/rabbitmq.config
# rabbitmq插件管理,启动管理端插件
rabbitmq-plugins enable rabbitmq_management
# 启动rabbitmq服务
systemctl start rabbitmq-server
# 查看服务状态
systemctl status rabbitmq-server
# 关闭防火墙
systemctl disable firewalld // 从开机启动中移出
systemctl stop firewalld // 关闭
# 访问登录web管理界面
http://192.168.0.116:15672/
默认用户名密码:guest/guest