一、RabbitMQ入门概念

306 阅读7分钟

1. MQ产品

  目前业界有很多的 MQ 产品,例如 RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ等。也有直接使用 Redis 充当消息队列的案例,而这些消息队列产品,各有侧重,在实际选型时,需要结合自身需求及 MQ 产品特征综合考虑,这里重点对比一下 RabbitMQ、RocketMQ 和 Kafka。

RabbitMQRocketMQKafka
公司/社区Rabbit阿里Apache
开发语言ErlangJavaScala、Java
支持语言1.官方支持Erlang、Java、Ruby等
2.社区有支持多种开发语言的API
Java1.官方支持Java
2.社区有支持PHP、Python的API
单机吞吐量万级十万级十万级(最好)
优点1.支持高并发、支持多种语言、社区活跃度高
2.功能完善,有自己的后台管理界面
1.使用Java语言开发,阿里内部广泛使用,满足大部分业务场景
2.分布式架构、高可用,消息可以做到零丢失
3.功能完善,扩展性好,可以阅读源码进行定制
1.主要应用于大数据领域,在数据采集、传输等业务场景中发挥至关重要的作用
选型建议RabbitMQ 性能好、延迟微秒级,管理界面用起来十分方便。如果你的数据量没有那么大,中小型公司优先选择功能比较完备的 RabbitMQRocketMQ 天生为互联网领域而生,对于可靠性要求很高的场景,比如:(1)电商里面的订单扣款;(2)业务削峰;(3)在大量交易涌入时,程序可能无法及时处理的情况。RoketMQ 在稳定性上可能更值得信赖,这些业务场景在阿里双 11 已经经历了多次考验,对于并发场景首先 RocketMQKafka为大数据而生,如果你的应用数据量特别大并且追求高吞吐量,比如:互联网大量数据采集业务,首选 kafka

2. RabbitMQ 概念

RabbitMQ 诞生于2007年,是基于 AMQP 标准、采用 Erlang 语言开发的一款消息中间件。

2.1 什么是 AMQP

AMQP 即 Advanced Message Queuing Protcocl(高级消息队列协议)。它是一个网络协议,为面向消息中间件设计的。基于此协议的客户端和消息中间件可传递消息,并不受客户端、开发语言等条件限制。
[ps:这么解释可能有点枯燥,你可以联想到 http 协议,其实就是类似这种规定]

2.2 什么是 JMS

  • JMS 即 Java 消息服务(JavaMessage Service)应用程序接口,是一个 Java 平台中关于面向消息中间件的API, 是 JavaEE 规范中的一种。
  • 很多消息中间件都实现了JMS规范,例如:ActiveMQ。RabbitMQ 官方没有提供 JMS 的实现包,但是开源社区有。

2.3 RabbitMQ 的架构

image.png

  • Broker :接收和分发消息的MQ应用,RabbitMQ Server 就是 Message Broker

  • Virtual host :出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个 vhost,每个用户在自己的 vhost 创建 exchange/queue 等

  • Connection :Producer/Consumer 和 broker 之间的 TCP 连接

  • Channel :如果每一次访问 Broker 都建立一个 Connection,在消息量大的时候建立 TCP Connection 的开销将是巨大的。 Channel 是在 Connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个线程创建单独的 Channel 进行通讯,AMQP method 包含了 channel id 帮助客户端和 Broker 识别 Channel,所以 Channel 之间是完全隔离的。Channel 作为轻量级的 Connection 极大减少了操作系统建立 TCP Connection 的开销

  • Exchange :它 Producer 产生的消息到达 Broker 的第一站。Exchange 根据分发规则,匹配到正确的 routing key,然后分发消息到 Queue 中去。常用的类型有:Direct (point-to-point)、 Topic (publish-subscribe) 和 Fanout(multicast)

  • Queue :消息最终被送到这里等待 Consumer 消费

  • Binding :Exchange 和 Queue 之间的虚拟连接。Binding 中可以包含 routing key,Binding 信息被存到 Exchange 中的查询表中,作为 message 的分发依据

3. RabbitMQ 安装

Downloading and Installing RabbitMQ

3.1 查询系统版本

lsb_release -a  

# 如果提示该命令不出在,则执行如下安装命令
yum install -y redhat-lsb
[root@vhpuccrv4yxgkqwq-0530595 ~]# lsb_release -a
LSB Version:	:core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID:	CentOS
Description:	CentOS Linux release 7.6.1810 (Core)
Release:	7.6.1810
Codename:	Core

官方安装文档针对 CentOS 提供了两种安装方式 :

3.2 rpm 方式

  • 安装 RabbitMQ 前必须安装 Erlang 语言环境,要选择对应的 RabbitMQ 版本和 Erlang 语言版本
  • RabbitMQ and Erlang version 参考

(1) 查看是否安装 OpenSSL 以及版本

[root@vhpuccrv4yxgkqwq-0530595 ~]# rpm -qa|grep -i openssl
openssl-1.0.2k-16.el7.x86_64
openssl-libs-1.0.2k-16.el7.x86_64
[root@vhpuccrv4yxgkqwq-0530595 ~]# openssl version -a

OpenSSL 1.0.2k-fips  26 Jan 2017
built on: reproducible build, date unspecified
platform: linux-x86_64
options:  bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx)
compiler: gcc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
OPENSSLDIR: "/etc/pki/tls"
engines:  rdrand dynamic

Supported RHEL, CentOS and Fedora Versions Please note the implicit OpenSSL/libcrypto dependency section above.

  • For Erlang 24: supports RHEL or CentOS 8, modern Fedora, Rocky Linux. Requires OpenSSL 1.1
  • for Erlang 23: RHEL or CentOS 8, RHEL or CentOS 7, modern Fedora. **Requires OpenSSL 1.0.x or 1.1 **

因为我的系统是 CentOS7 , OpenSSL 的版本是1.0.2。所以选择 Erlang23 和 RabbitMQ 3.8.x 以上版本进行安装(如果你的系统里面没有安装 OpenSSL 请自行安装

(2) 下载 Erlang 和 RabbitMQ Server 并安装

cd /usr/local
mkdir rabbit
cd rabbit
wget --content-disposition https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-23.3.2-1.el7.x86_64.rpm/download.rpm
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.15/rabbitmq-server-3.8.15-1.el7.noarch.rpm

从github上下载很慢甚至下载失败,请使用 国内源

wget https://mirrors.huaweicloud.com/rabbitmq-server/v3.8.15/rabbitmq-server-3.8.15-1.el7.noarch.rpm
  • 执行安装命令 顺序执行下面的命令,RabbitMQ 需要 socat 依赖
[root@vhpuccrv4yxgkqwq-0530595 rabbit]# rpm -ivh erlang-23.3.2-1.el7.x86_64.rpm

警告:erlang-23.3.2-1.el7.x86_64.rpm: 头V4 RSA/SHA1 Signature, 密钥 ID 6026dfca: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:erlang-23.3.2-1.el7              ################################# [100%]
yum install socat -y
[root@vhpuccrv4yxgkqwq-0530595 rabbit]# rpm -ivh rabbitmq-server-3.8.15-1.el7.noarch.rpm

警告:rabbitmq-server-3.8.15-1.el7.noarch.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID 6026dfca: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:rabbitmq-server-3.8.15-1.el7     ################################# [100%]
  • 查看是否安装成功
# 查看 erlang 版本
[root@vhpuccrv4yxgkqwq-0530595 rabbit]# erl -version

Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 11.2.1

(3) RabbitMQ 配置

  • 添加开机启动 RabbitMQ 服务
[root@vhpuccrv4yxgkqwq-0530595 rabbit]# chkconfig rabbitmq-server on

注意:正在将请求转发到“systemctl enable rabbitmq-server.service”。
Created symlink from /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service to /usr/lib/systemd/system/rabbitmq-server.service.
  • 启动 RabbitMQ 服务
[root@vhpuccrv4yxgkqwq-0530595 rabbit]# /sbin/service rabbitmq-server start

Redirecting to /bin/systemctl start rabbitmq-server.service
  • 查看 RabbitMQ 服务状态
/sbin/service rabbitmq-server status

image.png

  • 开启 web 管理插件
rabbitmq-plugins enable rabbitmq_management

通过 15672 端口访问 web 管理界面,用默认用户名:guest ,密码:guest登录。

image.png 提示:User can only log in via localhost
原因:RabbitMQ 从3.3.0开始禁止使用 guest/guest 权限来登录,但是 http://localhost:15672 可以用guest 用户登录访问

  • 添加新用户
# 添加账户
rabbitmqctl add_user username password

# 设置用户角色,这里创建的是超级管理员,方便学习
rabbitmqctl set_user_tags username administrator
  • 设置用户权限 usernane 这个用户具有 virtual host 中所有资源的配置、写、读权限
# set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
rabbitmqctl set_permissions -p "/" username ".*" ".*" ".*"
  • 查看用户和角色
rabbitmqctl list_users
  • RabbitMQ 服务停止
/sbin/service rabbitmq-server stop
  • 重置命令
rabbitmqctl stop_app  # 关闭应用

rabbitmqctl reset     # 清除应用,即还原的初始状态

rabbitmqctl start_app # 重新启动引用

rabbitmqctl 命令使用参考文档

4. 写在最后

  • 如果你在安装过程中遇到的问题比较多,也可以参考其他文档
  • 每天进步一点点,与君共勉 ☺