消息队列之RabbitMQ

2021-01-14 14:29:16 浏览数 (1)

思维导图

RabbitMQ

1. 消息中间件概述

1.1. 什么是消息中间件

MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法。

  • 为什么使用MQ 在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高系统吞吐量
  • 开发中消息队列通常有如下应用场景: 1、任务异步处理 将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。 2、应用程序解耦合 MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合。 3、削峰填谷 如订单系统,在下单的时候就会往数据库写数据。但是数据库只能支撑每秒1000左右的并发写入,并发量再高就容易宕机(电脑不能正常工作)。低峰期的时候并发也就100多个,但是在高峰期时候,并发量会突然激增到5000以上,这个时候数据库肯定卡死了。

消息被MQ保存起来了,然后系统就可以按照自己的消费能力来消费,比如每秒1000个数据,这样慢慢写入数据库,这样就不会卡死数据库了。

但是使用了MQ之后,限制消费消息的速度为1000,但是这样一来,高峰期产生的数据势必会被积压在MQ中,高峰就被掉了。但是因为消息积压,在高峰期过后的一段时间内,消费消息的速度还是会维持在1000QPS,直到消费完积压的消息,这就叫做“填谷”

1.2. AMQP 和 JMS

MQ是消息通信的模型;实现MQ的大致有两种主流方式:AMQPJMS

1.2.1. AMQP

AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。

1.2.2. JMS

JMSJava消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

1.2.3. AMQP 与 JMS 区别

  • JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互的格式
  • JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的。
  • JMS规定了两种消息模式;而AMQP的消息模式更加丰富

1.3. 消息队列产品

市场上常见的消息队列有如下:

  • ActiveMQ:基于JMS
  • ZeroMQ:基于C语言开发
  • RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好
  • RocketMQ:基于JMS,阿里巴巴产品
  • Kafka:类似MQ的产品;分布式消息系统,高吞吐量

1.4. RabbitMQ

RabbitMQ是由erlang语言开发,基于AMQPAdvanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。

RabbitMQ官方地址:http://www.rabbitmq.com/

RabbitMQ提供了6种模式:

  1. 简单模式
  2. work模式
  3. Publish/Subscribe发布与订阅模式
  4. Routing路由模式
  5. Topics主题模式
  6. RPC远程调用模式(远程调用,不太算MQ;暂不作介绍);

官网对应模式介绍:https://www.rabbitmq.com/getstarted.html

2. 安装及配置RabbitMQ

注意: 请使用资料里提供的CentOS-7-x86_64-DVD-1810.iso 安装虚拟机. 这里以腾讯云服务器展示

1. 安装依赖环境

在线安装依赖环境:

代码语言:javascript复制
yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c   kernel-devel m4 ncurses-devel tk tc xz

2. 安装Erlang

上传 put -r D:/..

  • erlang-18.3-1.el7.centos.x86_64.rpm
  • socat-1.7.3.2-5.el7.lux.x86_64.rpm
  • rabbitmq-server-3.6.5-1.noarch.rpm
代码语言:javascript复制
# 安装 erlang
[root@VM_0_16_centos rabbitmq]# rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:erlang-18.3-1.el7.centos         ################################# [100%]
[root@VM_0_16_centos rabbitmq]# 

如果出现如下错误

说明gblic 版本太低。我们可以查看当前机器的gblic 版本

代码语言:javascript复制
strings /lib64/libc.so.6 | grep GLIBC

当前最高版本2.12,需要2.15.所以需要升级glibc

使用yum更新安装依赖

代码语言:javascript复制
sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make -y

下载rpm包

代码语言:javascript复制
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-utils-2.17-55.el6.x86_64.rpm &
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-static-2.17-55.el6.x86_64.rpm &
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-2.17-55.el6.x86_64.rpm &
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-common-2.17-55.el6.x86_64.rpm &
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-devel-2.17-55.el6.x86_64.rpm &
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-headers-2.17-55.el6.x86_64.rpm &
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/nscd-2.17-55.el6.x86_64.rpm &

安装rpm包

代码语言:javascript复制
sudo rpm -Uvh *-2.17-55.el6.x86_64.rpm --force --nodeps

安装完毕后再查看glibc版本,发现glibc版本已经到2.17了

代码语言:javascript复制
strings /lib64/libc.so.6 | grep GLIBC

3. 安装RabbitMQ

代码语言:javascript复制
# 安装 socat
[root@VM_0_16_centos rabbitmq]# rpm -ivh socat-1.7.3.2-1.1.el7.x86_64.rpm 
warning: socat-1.7.3.2-1.1.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 87e360b8: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:socat-1.7.3.2-1.1.el7            ################################# [100%]
[root@VM_0_16_centos rabbitmq]# 
# 安装 rabbitmq-server
[root@VM_0_16_centos rabbitmq]# rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm 
warning: rabbitmq-server-3.6.5-1.noarch.rpm: Header V4 RSA/SHA1 Signature, key ID 6026dfca: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:rabbitmq-server-3.6.5-1          ################################# [100%]
[root@VM_0_16_centos rabbitmq]#

4. 开启管理界面及配置

代码语言:javascript复制
# 开启管理界面
rabbitmq-plugins enable rabbitmq_management
# 修改默认配置信息
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app 
# 比如修改密码、配置等等,例如:loopback_users 中的 <<"guest">>,只保留guest

5. 启动

代码语言:javascript复制
service rabbitmq-server start # 启动服务
service rabbitmq-server stop # 停止服务
service rabbitmq-server restart # 重启服务
  • 设置配置文件
代码语言:javascript复制
cd /usr/share/doc/rabbitmq-server-3.6.5/

cp rabbitmq.config.example /etc/rabbitmq/rabbitmq.config

6. 配置虚拟主机及用户

6.1. 用户角色

RabbitMQ在安装好后,可以访问http://ip地址:15672 ;其自带了guest/guest的用户名和密码;如果需要创建自定义用户;那么也可以登录管理界面后,如下操作:

登录页面

登录成功

添加用户

角色说明

1、 超级管理员(administrator)

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

2、 监控者(monitoring)

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

3、 策略制定者(policymaker)

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

4、 普通管理者(management)

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

5、 其他

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

6.2. Virtual Hosts配置

像mysql拥有数据库的概念并且可以指定用户对库和表等操作的权限。RabbitMQ也有类似的权限管理;在RabbitMQ中可以虚拟消息服务器Virtual Host,每个Virtual Hosts相当于一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互隔离的。exchange、queue、message不能互通。相当于mysql的db。Virtual Name一般以/开头。

6.2.1. 创建Virtual Hosts

6.2.2. 设置Virtual Hosts权限

  • 解决not found问题

/usr/share/doc/rabbitmq-server-3.6.5/rabbitmq.config.example复制到指定/etc/rabbitmq/rabbitmq.config,然后重新启动service rabbitmq-server restart

代码语言:javascript复制
[root@VM_0_16_centos ~]# cd /usr/share/doc/rabbitmq-server-3.6.5/
[root@VM_0_16_centos rabbitmq-server-3.6.5]# ll
total 200
-rw-r--r-- 1 root root 28945 Aug  5  2016 LICENSE
-rw-r--r-- 1 root root 11358 Aug  5  2016 LICENSE-APACHE2-ExplorerCanvas
-rw-r--r-- 1 root root 10175 Aug  5  2016 LICENSE-APL2-Rebar
-rw-r--r-- 1 root root 10851 Aug  5  2016 LICENSE-APL2-Stomp-Websocket
-rw-r--r-- 1 root root  1206 Aug  5  2016 LICENSE-BSD-base64js
-rw-r--r-- 1 root root  1304 Aug  5  2016 LICENSE-BSD-glMatrix
-rw-r--r-- 1 root root 14041 Aug  5  2016 LICENSE-EPL-OTP
-rw-r--r-- 1 root root  1087 Aug  5  2016 LICENSE-MIT-EJS10
-rw-r--r-- 1 root root  1069 Aug  5  2016 LICENSE-MIT-Flot
-rw-r--r-- 1 root root  1075 Aug  5  2016 LICENSE-MIT-jQuery164
-rw-r--r-- 1 root root  1087 Mar 31  2016 LICENSE-MIT-Mochi
-rw-r--r-- 1 root root  1087 Aug  5  2016 LICENSE-MIT-Mochiweb
-rw-r--r-- 1 root root  1076 Aug  5  2016 LICENSE-MIT-Sammy060
-rw-r--r-- 1 root root  1056 Aug  5  2016 LICENSE-MIT-SockJS
-rw-r--r-- 1 root root 16726 Aug  5  2016 LICENSE-MPL2
-rw-r--r-- 1 root root 24897 Aug  5  2016 LICENSE-MPL-RabbitMQ
-rw-r--r-- 1 root root 21023 Apr 11  2016 rabbitmq.config.example
-rw-r--r-- 1 root root   943 Mar 31  2016 README
-rw-r--r-- 1 root root   277 Mar 31  2016 set_rabbitmq_policy.sh.example
[root@VM_0_16_centos rabbitmq-server-3.6.5]# cp ./rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
[root@VM_0_16_centos rabbitmq-server-3.6.5]# service rabbitmq-server restart
Restarting rabbitmq-server (via systemctl):                [  OK  ]
[root@VM_0_16_centos rabbitmq-server-3.6.5]# 

刷新页面就成功啦

  • ? WeChat : 1210331079
  • ? QQ : 1210331079
  • ? 邮箱 : shaotongjie@gmail.com
  • ? 个人博客 : https://nateshao.gitee.io 或者 https://nateshao.github.io
  • ? GitHub : https://github.com/nateshao
  • ? Gitee : https://gitee.com/nateshao
  • ? 微信公众号 : 千羽的编程时光

0 人点赞