MQ 是中高级别Java程序员,必须要掌握的一门技术。

  • 什么是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

Eriang是 为高并发设计的语言 ,他不是Golang!

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)

官网:https://www.rabbitmq.com/

下载地址:https://www.rabbitmq.com/download.html

Java 官方文档:https://www.rabbitmq.com/tutorials/tutorial-one-java.html

JMS :Java Message Server,是Jave SE 面向消息中间件的API接口

ActiveMQ 遵循JMS规范,但是RabbitMQ 没有遵循。

Rabbit MQ Linux 安装 端口 5672 WEB 15672

(安装前,需要安装erlang环境,RabbitMQ,安装前,会让你去下载erlang环境,然后安装rabbitMQ)

不同版本的Rabbit MQ 必须使用对应范围的erlang环境:这点很重要,如果你是新手,不信这点,你还会再回来,看这句话的。

Rabbit 官方教程:http://erlang.org/download/otp_win64_23.2.exe

RabbitMQ的配置:https://www.rabbitmq.com/configure.html#config-items

安全组,防火墙 开放 5672、15672

1、环境确认

这里,我不扯淡,翻以前的资料确实坑,CentOS8 不支持一些erlang的版本,但是老版本RabbitMQ 又依赖于它。不如我们干脆,干最新的版本
首先 先去找你想要的RabbitMQ ,我们需要满足2个 centOS8 能安装rabbitMQ、又要满足与centOS8 能安装erlang,所以RabbitMQ 越新越好。

这里我使用的RabbitMQ 是3.8.9
Erlang版本是 从GitHub上弄下来的,你可以看下面自己弄。

2、安装前操作 (新机器,跳过)

如果有老版本 直接干掉 这里有问题,可以去百度卸载 即可。
先暂停服务 
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
 
centOS 7 安装 请使用 yum install erlang

dnf install erlang

#查看当前erlang的版本
yum list | grep erlang

找到合适的RabbitMQ的版本下载下来

然后直接
 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
不同版本显示不一样,最终还是需要以 lsof -i:5672 被占用为准

(这里有个巨大的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的管理界面

高版本,可能用不到了, 请跳到 常用命令

# 开启管理界面
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 set_user_tags 用户名 administrator
rabbitmqctl set_permissions -p / 用户名 ".*" ".*" ".*"


开放防火墙的端口(安全组 我默认你开放了)

开放端口(开放后需要要重启防火墙才生效)
firewall-cmd --zone=public --add-port=端口号/tcp --permanent

重启防火墙
firewall-cmd --reload

访问吧 http://192.168.3.10:15672/ IP 你自己替换下

说明

权限角色说明

1、 超级管理员(administrator)

可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。

2、 监控者(monitoring)

可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

3、 策略制定者(policymaker)

可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。

4、 普通管理者(management)

仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。

5、 其他

无法登陆管理控制台,通常就是普通的生产者和消费者。

Virtual Hosts

每个Virtual Hosts相当于一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互隔离的。exchange、queue、message不能互通。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注