MQ(Message Quene) : 翻译为消息队列,通过典型的生产者和消费者模型,生产者不断向消息队列中生产 消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和 接收,没有业务逻辑的侵入,轻松的实现系统间解耦。别名为 消息中间件通过利用高效可靠的消息传递机 制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。
1.2 MQ有哪些当今市面上有很多主流的消息中间件,如老牌的ActiveMQ、RabbitMQ,炙手可热的Kafka,阿里巴巴 自主开发 RocketMQ 等。
1.3 不同MQ特点
1.ActiveMQ ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息队列。它是一个完全支持JMS规范的的消息 中间件。丰富的API,多种集群架构模式让ActiveMQ在业界成为老牌的消息中间件,在中小型企业颇受欢迎!
2.Kafka Kafka是linkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是 基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持 复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业 务。
3.RocketMQ RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系 统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做 了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场 景。
4.RabbitMQ RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向 消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内对数据一致 性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
RabbitMQ比Kafka可靠,Kafka更适合IO高吞吐的处理,一般应用在大数据日志处理或对实时性(少 量延迟),可靠性(少量丢数据)要求稍低的场景使用,比如ELK日志收集。
二、RabbitMQ 2.1 RabbitMQ简介 1)RabbitMQ概念RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于APMQ协议来实现。AMQP的主要特征是面 向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对 数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
2)AMQP核心概念AMQP 协议 AMQP(advanced message queuing protocol)`在2003年时被提出,最早用于解决金融领不同平台之 间的消息传递交互问题。顾名思义,AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数 据格式。这使得实现了AMQP的provider天然性就是跨平台的。
以下是AMQP协议模型:
Publisher 推送消息前先与Server建立连接,找到Virtual host,然后将消息推送至Exchange交换机。 而交换机与Message Queue有绑定关系(一个交换机相当于一个独立的虚拟机,而这个虚拟机内的各种独立的 应用就相当于一个Queue,这个Queue与交换机绑定),Consumer通过绑定的对队列,而交换机也绑定了队 列。发送者将消息发送给交换机,这样就能完成消息的推送了。
RabbitMQ优点:
- 开源、性能优秀、稳定性保障 提供可靠性消息投递模式(/confirm/i)、返回模式(return)
- 与SpringAMQP完美的整合、API丰富。
- 集群模式丰富、表达式配置、HA模式、镜像队列模型
- 保证数据不丢失的前提做到高可靠性、可用性。
- Erlang语言在交换机的交互方面性能优秀的(Erlang语言最初在于交换机领域的架构模式, 这样使得RabbitMQ在Broker之间进行数据交互的性能是非常优秀的)
- Erlang有着和原生Socket一样的延迟
官方下载网址:https://www.rabbitmq.com/download.html
2.2.1 下载的安装包2.2.2 安装步骤注意: 这里的安装包是centos7安装的包
1)将相关依赖以及安装包上传到linux系统中
2)安装Erlang依赖包
rpm -ivh openssl-libs-1.0.2k-19.el7.x86_64.rpm --force #依赖库 rpm -ivh erlang-22.0.7-1.el7.x86_64.rpm
3)安装RabbitMQ安装包(需要联网)
rpm -ivh socat-1.7.3.2-2.el7.x86_64.rpm #依赖库 rpm -ivh rabbitmq-server-3.7.18-1.el7.noarch.rpm 或者 yum install -y rabbitmq-server-3.7.18-1.el7.noarch.rpm 注意:默认安装完成后配置文件模板在: /usr/share/doc/rabbitmq-server-3.7.18/rabbitmq.config.example目录中, 需要将配置文件复制到/etc/rabbitmq/目录中,并修改名称为rabbitmq.config
4)复制配置文件
cp /usr/share/doc/rabbitmq-server-3.7.18/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
5)查看配置文件位置
ll /etc/rabbitmq/rabbitmq.config
6)修改配置文件
vim /etc/rabbitmq/rabbitmq.config
7)执行如下命令,启动rabbitmq中的插件管理
rabbitmq-plugins enable rabbitmq_management # 开启web控制台的访问
8) 启动RabbitMQ的服务
systemctl start rabbitmq-server # 开启服务 systemctl restart rabbitmq-server # 重启服务 systemctl stop rabbitmq-server # 停止服务
9)查看服务状态
systemctl status rabbitmq-server
10)关闭防火墙
systemctl disable firewalld systemctl stop firewalld ----------------------------------------- 或者放开对应端口 firewall-cmd --zone=public --add-port=15672/tcp --permanent firewall-cmd --zone=public --add-port=5672/tcp --permanent service firewalld restart (重启服务)
11)访问web管理界面
http://192.168.147.128:15672/
2.3 RabbitMQ web管理界面
connections:无论生产者还是消费者,都需要与RabbitMQ建立连接后才可以完成消息的生产和消费,在这里可以查看连接情况。
channels:通道,建立连接后,会形成通道,消息的投递获取依赖通道。
Exchanges:交换机,用来实现消息的路由。
Queues:队列,即消息队列,消息存放在队列中,等待消费,消费后被移除队列。
1)创建虚拟主机
#虚拟主机
为了让各个用户可以互不干扰的工作,RabbitMQ添加了虚拟主机(Virtual Host)的概念。
这其实就是一个独立的访问路径,不同用户使用不同路径,各自有自己的队列、交换机,互相不会影响。
2)用户管理
注意:默认新建的用户不能询问任何虚拟主机,需要设置用户和虚拟主机的绑定。
上面的Tags选项,其实是指定用户的角色,可选的有以下几个:
超级管理员(aministrator):可登陆管理控制台,可查看所有的信息,并且可以对用户,
策略(policy)进行 *** 作。
监控者(monitoring):可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,磁盘使用情况等)
策略制定者(policymaker):可以登陆管理控制台,同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
普通管理者(management):仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。
其他:无法登陆管理控制台,通常就是普通的生产者和消费者。
3)绑定虚拟主机和用户
进入虚拟机设置页面
命令行与管控台–基础到高级 *** 作
2.4 RabbitMQ支持的消息模型1.rabbitmqctl stop_app:关闭应用
2.rabbitmqctl start_app:启动应用
3.rabbitmqctl status:节点状态
------------------------------------------------------
1.rabbitmqctl add_user username password:添加用户
2.rabbitmqctl list_users:列出所有用户
3.rabbitmqctl delete_user username:删除用户
4.rabbitmqctl clear_permissions -p vhostpath username:清除用户权限
5.rabbitmqctl list_user_permissions username:列出用户权限
6.rabbitmqctl change_password username newpassword:修改密码
7.rabbitmqctl set_permissions -p vhostpath username ".*" ".*" ".*":设置用户权限
--------------------------------------------------------
1.rabbitmqctl add_vhost vhostpath:创建虚拟主机
2.rabbitmqctl list_vhosts:列出所有虚拟主机
3.rabbitmqctl list_permissions -p vhostpath:列出虚拟主机上所有权限
---------------------------------------------------------
1.rabbitmqctl list_queues:查看所有队列信息
2.rabbitmqctl -p vhostpath purge_queue blue:清除队列里的消息
----------------------------------------------------------
1.rabbitmqctl reset:移除所有数据,要在rabbitmqctl stop_app之后使用
2.rabbitmqctl join_cluster [-ram]:组成集群命令
3.rabbitmqctl cluster_status:查看集群状态
4. rabbitmqctl change_cluster_node_type disc | ram 修改集群节点的存储方式
5. rabbitmqctl forget_cluster_node [-offline] 忘记节点(摘除节点)
集群配置失败,故障转移等情况下可以将启动失败的节点给移除掉,
它可以在不启动的情况下完成对节点的摘除
1.rabbitmqctl rename_cluster_node oldnode1 newnode1 [oldnode2] [newnode2...](修改节点名称)
注意:命令行的 *** 作能做的,可视化界面也可以做。
#1.服务启动相关
systemctl start | restart | stop | status rabbitmq-server
#2.管理命令行 用来在不使用web管理界面情况下命令 *** 作RabbitMQ
rabbitmqctl help 可以查看更多命令
#3.插件管理命令行
rabbitmq-plugins enable | list | disable
官网地址:http://www.rabbitmq.com/
官方教程:http://www.rabbitmq.com/getstarted.html
消息中间件的消息分为两类传输模式:点对点模型、发布/订阅模型
RabbitMQ在此基础上进行细化,提供了7种消息模型,但是第6种其实是RPC,
并不是MQ,第7种是最新版本才有的,企业中一般不会使用最新版本,因此6,7就不介绍了。
- 点对点模型:同一消息只能被一个消费者接收
- 发布/订阅模型:同一消息可以被多个消费者接收
使用rabbitMQ的原生代码,在开发中绝对不用,因为后面我们学习Spring整合RabbitMQ,
用于理解rabbitMQ五种消息模型
1)简单消息模型
ACK消息确认机制
自动回执(消费者一旦监听到消息,立马通知rabbitmq删除队列消息)
- 消费者一旦拿到消息,立马发送回执
- 当此业务不是主要的业务,数据不敏感,就可以使用自动回执
手动回执(消费者处理完业务逻辑后,再通知rabbitmq删除队列消息)
- 消费者拿到数据之后,根据处理的结果,再看是否要发送回执
- 当此业务是主要业务,不执行成功就会影响其他的业务,这时候就要使用手动回执。
2)Work消息模型
3 ) 订阅模型-Fanout
4)订阅模型-Direct
5)订阅模型-Topic
通配符规则:
- # :匹配一个或多个词
- * :匹配不多不少恰好1个词
举例:
- pro.#:能够匹配pro.insert.add或者pro.insert
- pro.*:只能匹配pro.insert
6)持久化机制
如何避免消息丢失?
1)消费者的ACK机制,可以防止消费者丢失消息。
2) 但是,如果在消费者消费之前,MQ就宕机了,消息就没了。
解决方案:MQ持久化机制
1.开启交换机持久化【生产者】
2. 开启队列持久化【消费者】
3.开启消息持久化【生产者】
注:以上内容为学习笔记,仅供学习交流
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)