快速导航:
什么是MQ?
Message Quete 消息队列,是指消息传输中存储消息的容器。多用于分布式系统。
MQ的优势 劣势
优势
- 应用解耦 :系统耦合性越高,容错性、可维护性就很低。(降低服务与服务之间的远程调用)
- 异步提速 :服务与服务之间交流会消耗大量的时间,使用消息中间件,不用担心对方有没有直接收到消息,会节省很多的时间。。
- 削峰填谷 :将大量的直接的访问,打在MQ中,不直接打在服务上。然后服务慢慢的从MQ中拉取处理。牺牲时间换稳定性 。例如:高并发情况,用户操作数据库,数据库容易挂,只需将操作的消息,存储到MQ中,让其他服务获取MQ消息,慢慢处理。顺时压力转移到MQ上。
劣势
- 一致性问题 :消息由A、B 、C依次处理,A、B成功,C失败,消息就不一致了。
- 系统可用性降低 :引入MQ,就需要保证MQ正常启动。
- 系统复杂度提高 :引入MQ,需要保证消息正常被获取。
使用MQ的场景
- 生产者不需要从消费者获取反馈。(如果需要A调用B -> B做完 ->A获取B做完后 继续做下面的事情。就不适合使用MQ)
- 容许短暂的不一致性
- MQ 优势确实大,但需确保有实力能做好MQ
常见的MQ产品
Erlang是 为高并发设计的语言 ,他不是Golang!
得益于微妙级别的延迟,RabbitMQ更适合做游戏中间件使用。
RabbitMQ的简介:
AMQP,06年发布,Advanced Meaagse Quruing Ptorocol 即高级队列协议,是一个网络协议,属应用层,为面向消息的中间件设计。基于此协议的客户端与消息中间件产品进行通信,不受客户端\中间件产品不同的限制,不同语言均可开发。
可以把AMQP 理解成HTTP 协议,AMQP 协议中 定义了一些角色
- Publisher:消息生产者
- Excange:交换机:分发消息
- Routes:路由
- Queue:消息存储的容器
- Consumer:消息消费者
RabbitMQ 基础架构图
RabbitMQ 基本概念
Broker:接收、分发消息的应用。核心
Virtual Host:虚拟机:逻辑分区,可理解为 Mysql的数据库。
Connection:生产者、消费者、Broker 之间的TCP连接。
Channel:信道:减少TCP的Connection的开销作用。
Exchange:交换机:消息到达 Broker的第一站。常见类型有 direct、topic、fanout
Queue:队列:消息在这等待消费者取走。
Binding:交换机与队列绑定的过程。Binding信息保存于exchange中的查询表中,用与message的分发依据。
RabbitMQ 的7种工作模式
上图分为下面的模式
简单模式
work queues
Publich/Subscribe发布订阅模式
路由模式
Topics主题模式
RPC远程调用模式 (不算MQ)
JMS :Java Message Server,是Jave SE 提供面向消息中间件的API接口
ActiveMQ 遵循JMS规范,但是RabbitMQ 没有遵循。
RabbitMQ Linux 安装
centOS7 请参考:https://www.zanglikun.com/13183.html
服务端口 5672 WEB端口 15672
(安装前,需要安装erlang环境,RabbitMQ)
不同版本的RabbitMQ 必须使用对应范围的erlang环境:这点很重要,如果你是新手,不信这点,你还会再回来,看这句话的。版本对应地址:https://www.rabbitmq.com/which-erlang.html
RabbitMQ的配置:https://www.rabbitmq.com/configure.html#config-items
服务器需要设置:安全组,防火墙 开放 5672、15672 tcp端口
放行一些防火墙的端口(如果是云服务器的,话安全组 我默认你开放了)
开放端口(开放后需要要重启防火墙才生效)
firewall-cmd --zone=public --add-port=端口号/tcp --permanent
重启防火墙
firewall-cmd --reload
1、环境确认
这里,我不扯淡,翻以前的资料确实坑,CentOS8 不支持一些erlang的版本,但是老版本RabbitMQ 又依赖于它。不如我们干脆,干最新的版本
首先 先去找你想要的RabbitMQ版本 ,我们需要满足2个条件 centOS8 能安装rabbitMQ、又要满足与centOS8 能安装erlang,所以RabbitMQ 版本越新越好。
这里我使用的RabbitMQ 是3.8.9
Erlang版本是 从GitHub上弄下来的,你可以看下面自己弄。
2、卸载老版本RabbitMQ、erlang 没有的直接跳过
# 如果有老版本 直接干掉 这里有问题,可以去百度卸载 即可。
# 先暂停服务
service rabbitmq-server stop
# 卸载RabbitMQ
yum -y remove rabbitmq-server.noarch
# 卸载erlang
yum -y remove erlang-*
yum remove erlang.x86_64
# 删不干净,但不影响使用,具体可以百度。但不保证 能删干净。
3、安装
一、安装erlang
# 添加仓库
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
Detected operating system as centos/8.
# 查看erlang版本
yum list | grep erlang
# cnetso 8 安装erlang
dnf install erlang
# centOS 7 安装 请使用 yum install erlang
# 查看当前erlang的版本
erl -version
# 找到合适的RabbitMQ的版本下载下来 https://github.com/rabbitmq/rabbitmq-server/releases
# 格式:rpm -ivh 你下载的mq.rpm文件,上传到服务器
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm
#centOS7 可能会缺失socat的话,那就
yum install socat
安装完成后,就可以启动了,RabbitMQ 安装后,就是内置的服务,可以直接service启动
# 启动命令
service rabbitmq-server start
service rabbitmq-server stop
service rabbitmq-server restart
(这里有个巨大的BUG,启动提示你成功,一定要看 lsof -i:5672 看下端口是否被占用,不占用,一定要去看下 erl -v 看下版本,再去看下 https://www.rabbitmq.com/which-erlang.html 看下rabbitMQ 与 erlang 的版本是否兼容,不兼容,你累死,也找不到原因
这是看当前相关软件版本的命令
# 查看erlang的版本
yum list | grep erlang
# 查看rabbitMQ的版本
yum list | grep rabbitmq-server
然后去开启RabbitMQ的管理界面端口15672
默认此插件是不开启的,我们只有开启才能访问Dashboard
# 直接输入命令:开启管理界面
rabbitmq-plugins enable rabbitmq_management
# 修改默认配置信息,一般不要动
vim /usr/lib/rabbitmq/lib/rabbitmq_server-版本/ebin/rabbit.app
# 比如修改密码、配置等等,例如:loopback_users 中的 <<"guest">>,只保留guest
保存文件 重启即可
常用命令
# 添加开机启动RabbitMQ服务
chkconfig rabbitmq-server on
# 启动服务
service rabbitmq-server start
# 开启web端ui
占用端口15672 请务必 开启云服务器的 安全组与防火墙放行
rabbitmq-plugins enable rabbitmq_management
# 停止服务
service rabbitmq-server stop
# 查看当前所有用户
rabbitmqctl list_users
# 由于RabbitMQ默认的账号用户名和密码都是guest。为了安全起见, 先删掉默认用户
rabbitmqctl delete_user guest
# 必须先启动才能执行
# 添加新用户
rabbitmqctl add_user 用户名 密码
# 比如 rabbitmqctl add_user zanglikun zanglikun
# 设置权限,并开启远程访问
rabbitmqctl set_user_tags 用户名 administrator
rabbitmqctl set_permissions -p / 用户名 ".*" ".*" ".*"
# 比如 rabbitmqctl set_user_tags zanglikun administrator
# 比如 rabbitmqctl set_permissions -p / zanglikun ".*" ".*" ".*"
# 重启服务
service rabbitmq-server restart
访问吧 http://192.168.3.10:15672/ IP 你自己替换下
RabbitMQ角色说明
权限角色说明:
1、 超级管理员(administrator)
可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。
2、 监控者(monitoring)
可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
3、 策略制定者(policymaker)
可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
4、 普通管理者(management)
仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。
5、 其他
无法登陆管理控制台,通常就是普通的生产者和消费者。
Virtual Hosts
每个Virtual Hosts相当于一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互隔离的。exchange、queue、message不能互通。
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
评论(0)