消息队列概念
消息队列是在消息的传输过程中保存消息的容器。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。
常见的消息队列
-
RabbitMQ
基于AMQP(高级消息队列协议)基础上完成的,
erlang
语言开发的企业消息系统,是当前最主流的消息中间件之一,下文我们会详细介绍这一种。 -
ActiveMQ
基于JMS 规范,Apache软件基金会所研发的开源产品,用 Java 语言实现
-
RocketMQ
基于JMS 规范,阿里公司的开源产品,用 Java 语言实现
-
Kafka
阿里公司的开源产品,一种高吞吐量的分布式发布订阅消息系统
持久化对比
简单来说就是将数据存入磁盘,而不是存在内存中随服务器重启断开而消失,使数据能够永久保存
ActiveMQ | RabbitMQ | Kafka | RocketMQ | |
---|---|---|---|---|
文件存储 | 支持 | 支持 | 支持 | 支持 |
数据库 | 支持 | / | / | / |
分发策略对比
MQ消息队列有如下几个角色
- 生产者
- 存储消息
- 消费者
那么生产者生成消息以后,MQ进行存储,消费者是如何获取消息的呢?
一般获取数据的方式无外乎推(push)或者拉(pull)两种方式,典型的git就有推拉机制,我们发送的http请求就是一种典型的拉取数据库数据返回的过 程。而消息队列MQ是一种推送的过程,而这些推机制会适用到很多的业务场景也有很多对应推拉机制策略。
ActiveMQ | RabbitMQ | RocketMQ | Kafka | |
---|---|---|---|---|
发布订阅 | 支持 | 支持 | 支持 | 支持 |
轮询分发 | 支持 | 支持 | / | 支持 |
公平分发 | / | 支持 | / | 支持 |
重发 | 支持 | 支持 | 支持 | / |
消息拉取 | / | 支持 | 支持 | 支持 |
RabbitMQ概念
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
AMQP协议
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。
是在tcp/ip协议基础之上构建的一种约定成俗的规范和机制,它使得遵从该规范的客户端应用和消息中间件服务器的全功能互操作成为可能.
面试题:为什么消息中间件不直接使用http协议呢?
- 一是因为http协议的请求和响应报文头都是很复杂的,对于一个消息来说不需要这么复杂,只需要负责数据的传递,存储和分发即可,一定要追求的是高性能
- 二是大部分情况下http协议都是短链接,这就导致数据可能会丢失,而消息中间件是长期获取消息的过程,出现问题就要对数据进行持久化,目的就是为了保障数据的稳定运行
安装
官网地址: https://www.rabbitmq.com/
下载地址:https://www.rabbitmq.com/download.html
版本兼容
官方版本兼容比较地址:https://www.rabbitmq.com/which-erlang.html
一定要注意版本问题 rabbitmq+erlang+centos的版本得都得考虑
centos7用erlang23版本或者23以下版本,centos8用erlang24版本
查看系统版本号
[root@hecs-66166 ~]# lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.9.2009 (Core)
Release: 7.9.2009
Codename: Core
Erlang安装
-
RabbitMQ是采用Erlang语言开发的,所以系统环境必须提供Erlang环境,第一步就是安装Erlang。
-
下载地址: https://www.erlang-solutions.com/downloads/ ,这个下载速度非常的慢,可以从我的网盘地址 直接下载
-
将下载的安装包上传到/usr/rabbitmq包下,需要新建目录rabbitmq
-
安装命令
rpm -ivh erlang-21.3-1.el7.x86_64.rpm
-
查看版本
erl -v
socat安装
-
RabbitMQ需要的依赖:socat和logrotate,logrotate操作系统中已经存在了,只需要安装socat就
可以了。 -
安装命令
yum install -y socat
RabbitMQ安装
-
下载地址: https://www.rabbitmq.com/download.html,这个下载速度也是非常的慢,可以从我的网盘地址 直接下载
-
将下载的安装包上传到/usr/rabbitmq包下
-
安装命令
rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm
-
启动服务
[root@hecs-66166 rabbitmq]# systemctl start rabbitmq-server [root@hecs-66166 rabbitmq]# systemctl status rabbitmq-server ● rabbitmq-server.service - RabbitMQ broker Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; disabled; vendor preset: disabled) Active: active (running) since Wed 2023-05-10 02:19:55 CST; 11s ago Main PID: 10260 (beam.smp) Status: "Initialized" CGroup: /system.slice/rabbitmq-server.service ├─10260 /usr/lib64/erlang/erts-10.3/bin/beam.smp -W w -K true -A 64 -MBas ageffcbf -MHas... ├─10365 erl_child_setup 32768 ├─10390 /usr/lib64/erlang/erts-10.3/bin/epmd -daemon ├─10413 inet_gethost 4 └─10414 inet_gethost 4 May 10 02:19:53 hecs-66166 rabbitmq-server[10260]: ########## Licensed under the MPL 2.0. Websi...com May 10 02:19:53 hecs-66166 rabbitmq-server[10260]: Doc guides: https://rabbitmq.com/documentation.html May 10 02:19:53 hecs-66166 rabbitmq-server[10260]: Support: https://rabbitmq.com/contact.html May 10 02:19:53 hecs-66166 rabbitmq-server[10260]: Tutorials: https://rabbitmq.com/getstarted.html May 10 02:19:53 hecs-66166 rabbitmq-server[10260]: Monitoring: https://rabbitmq.com/monitoring.html May 10 02:19:53 hecs-66166 rabbitmq-server[10260]: Logs: /var/log/rabbitmq/rabbit@hecs-66166.log May 10 02:19:53 hecs-66166 rabbitmq-server[10260]: /var/log/rabbitmq/rabbit@hecs-66166_upgrade.log May 10 02:19:53 hecs-66166 rabbitmq-server[10260]: Config file(s): (none) May 10 02:19:55 hecs-66166 rabbitmq-server[10260]: Starting broker... completed with 0 plugins. May 10 02:19:55 hecs-66166 systemd[1]: Started RabbitMQ broker. Hint: Some lines were ellipsized, use -l to show in full.
-
命令
# 启动服务 > systemctl start rabbitmq-server # 查看服务状态 > systemctl status rabbitmq-server # 停止服务 > systemctl stop rabbitmq-server # 开机启动服务 > systemctl enable rabbitmq-server
相关端口
- 5672:RabbitMQ的通讯端口
- 25672:RabbitMQ的节点间的CLI通讯端口是
- 15672:RabbitMQ HTTP_API的端口,管理员用户才能访问,用于管理RabbitMQ,需要启动Management插件。
- 1883,8883:MQTT插件启动时的端口。
- 61613、61614:STOMP客户端插件启用的时候的端口。
- 15674、15675:基于webscoket的STOMP端口和MOTT端口
图形化管理界面及授权操作
安装
-
安装命令
rabbitmq-plugins enable rabbitmq_management
-
重启mq服务
systemctl restart rabbitmq-server
一定要记住,在对应服务器(阿里云,腾讯云等)的安全组中开放
15672
的端口,如果有安装的宝塔同样也要开放15672端口 -
浏览器访问http://ip:15672/
授权账号和密码
-
新增用户
rabbitmqctl add_user admin admin
-
设置用户角色
用户级别: 1、administrator 可以登录控制台、查看所有信息、可以对rabbitmq进行管理 2、monitoring 监控者 登录控制台,查看所有信息 3、policymaker 策略制定者 登录控制台,指定策略 4、managment 普通管理员 登录控制台 [root@hecs-66166 rabbitmq]# rabbitmqctl set_user_tags admin administrator Setting tags for user "admin" to [administrator] ...
-
为用户设置权限
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
-
登录访问
-
命令小结
#添加用户 rabbitmqctl add_user 账号 密码 #设置用户操作角色 rabbitmqctl set_user_tags 账号 administrator #修改用户密码 rabbitmqctl change_password Username Newpassword 修改密码 #删除用户 rabbitmqctl delete_user Username #查看用户清单 rabbitmqctl list_users 查看用户 #设置用户资源权限 rabbitmqctl set_permissions -p / 用户名 ".*" ".*" ".*"
用户角色分类
-
none
什么也干不了,也无法登陆到图形化界面, 基本也没有用
-
management 普通管理员
相当于个人中心,只查看自己的相关节点信息
-
policymaker 策略制定者
在个人中心基础上,可以管理 (创建、删除) 自己的虚拟机节点和参数信息
-
monitoring 监控者
和管理员一样,除了看自己的还是看别人的,但是只能看,不能操作别人的
-
Administrator 超级管理员
顶级管理员,可登陆控制台、查看所有信息、可对 rabbitmq进行管理 (全部)
页面介绍
-
Overview
主要展示的是
MQ
的概要信息 , 如消息的数量,Connection
,Channel
,Exchange
,Queue
,Consumer
的数量 -
connections
查看生产者或消费者与
RabbitMQ
建立连接后的信息 -
channels
通道,建立连接后,会形成通道,消息的投递获取依赖通道
-
Exchanges
交换机,用来实现消息的路由,主要展示的是当前虚拟主机下的交换器,也可以在此添加一个新的交换器, 并且配置对应的交换器的规则属性
-
Queues
队列,即消息队列,消息存放在队列中,等待消费,消费后被移除队列
-
Admin
系统管理,展示的是用户管理的信息, 包含用户列表的展示,添加用户,添加虚拟主机等信息