RabbitMQ简介
1. MQ引言
1.1 什么是MQ?
消息队列中间件(Message Queue Middleware,简称为MQ)是指利用高效可靠的消息传输机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,它可以在分布式环境下扩展进程间的通信。生产者不断地向消息队列中生成消息,消费者不断的从队列中获取消息,因为消息的生成和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,轻松实现系统间解耦。
消息队列中间件,或者称为消息队列或者消息中间件。它一般有两种传递模式:点对点(P2P)模式和发布/订阅(Pub/Sub)模式。
- 点对点模式是基于队列的,消息生产者发送消息到队列,消费者从队列中接收消息,队列的存在使得消息的异步传输成为可能。
- 发布订阅模式定义了如何向一个内容节点发布和订阅消息,这个内容节点称为主题(Topic),主题可以认为是消息传递的中介,消息发布者将消息发布到某个主题,而消息订阅者则从主题中订阅消息。主题使得消息的订阅者和消息的发布者互相保持独立,不需要进行接触即可保证消息的传递,发布/订阅模式在消息的一对多广播时采用。
MQ有哪些?
目前开源的消息中间件有很多,比如老牌的ActiveMQ、RabbitMQ、炙手可热的Kafka、阿里巴巴自主开发的RocketMQ等。面向消息的中间件(简称MOM,Message Oriented Middleware)提供了以松散耦合的灵活方式集成应用程序的一种机制。它们提供了基于存储和转发的应用程序之间的异步数据发送方式。
不同MQ的特点
-
ActiveMQ
ActiveMQ是Apache出品,最流行的、能力强劲的开源消息总线。它是一个完全支持JMS规范的消息中间件、丰富的API,多种集群架构模式让ActiveMQ在业界称为老牌的消息中间件,在中小型企业颇受欢迎。 -
Kafka
Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前是Apache顶级开源项目。Kafka主要特点是基于Pull的模式处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输,Kafka在0.11版本中除了引入了Exactly Once语义,还引入了事务特性。Kafka事务特性是指一系列的生产者生产消息和消费者提交偏移量的操作在一个事务中,或者说是一个原子操作,生产消息和提交偏移量同时成功或者失败。Kafka更适合IO高吞吐的处理,一般应用在大数据日志处理或对实时性(少量延迟)、可靠性(少量丢数据)要求稍低的场景使用,比如ELK日志收集。 -
RocketMQ
RocketMQ是一个纯Java开发,具有高吞吐量,高可用性,适合大规模分布式、队列模型特点的开源消息中间件,前身是MetaQ,是阿里参考Kafka特点研发的一个队列模型的消息中间件,它对消息的可靠传输及事务性能做了优化,后开源给apache基金会成为了apache的顶级开源项目,具有高性能、高可靠、高实时、分布式特点。目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。 -
RabbitMQ
RabbitMQ是使用ErLang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内部对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
2. RabbitMQ安装和简单使用
在安装RabbitMQ之前需要安装ErLang。另外RabbitMQ RPM软件包需要sudo权限才能安装和管理,在无法使用sudo的环境中,可以使用二进制包的形式编译安装。
2.1 安装Erlang
在安装RabbitMQ之前,必须安装受支持的Erlang/OTP版本。
Erlang和RabbitMQ的版本对应关系如下:
这里我们选择通过repository的形式安装Erlang,以CentOS7操作系统
- 增加repository实体
将Erlang Solutions存储库(包括用于验证已签名软件包的公共密钥)添加到系统仓库列表中,命令如下:
[root@wechatserver ~]# sudo wget https://packages.erlang-solutions.com/erlang-solutions-2.0-1.noarch.rpm
[root@wechatserver ~]# sudo rpm -Uvh erlang-solutions-2.0-1.noarch.rpm
[root@wechatserver ~]# cat /etc/yum.repos.d/erlang_solutions.repo
[erlang-solutions]
name=Centos $releasever - $basearch - Erlang Solutions
baseurl=http://packages.erlang-solutions.com/rpm/centos/$releasever/$basearch
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg//erlang_solutions.asc
enabled=1
- 添加具有依赖性的存储库
软件包需要一些标准存储库中不存在的软件包。 请确保已启用EPEL存储库。
注意:对于前两步,也可以使用自动化脚本完成erlang的仓库配置,命令如下:
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
- 安装Erlang
sudo yum install erlang
- 检查erlang的版本号
erl
2.2 安装RabbitMQ
- 先导入两个key
rpm --import https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
rpm --import https://packagecloud.io/gpg.key
- 完成RabbitMQ的前置条件配置
curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash
- 使用rpm方式安装
rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
# This example assumes the CentOS 8 version of the package.
# For CentOS 7, replace "el8" with "el7".
yum install rabbitmq-server-3.8.9-1.el8.noarch.rpm
具体过程为:
[root@wechatserver software]# yum install rabbitmq-server
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.neusoft.edu.cn
* epel: mirrors.bfsu.edu.cn
* epel-debuginfo: mirrors.bfsu.edu.cn
* epel-source: mirrors.bfsu.edu.cn
* extras: mirrors.neusoft.edu.cn
* updates: mirrors.huaweicloud.com
Resolving Dependencies
--> Running transaction check
---> Package rabbitmq-server.noarch 0:3.8.9-1.el7 will be installed
--> Processing Dependency: socat for package: rabbitmq-server-3.8.9-1.el7.noarch
--> Running transaction check
---> Package socat.x86_64 0:1.7.3.2-2.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==================================================================================================================
Package Arch Version Repository Size
==================================================================================================================
Installing:
rabbitmq-server noarch 3.8.9-1.el7 rabbitmq_rabbitmq-server 15 M
Installing for dependencies:
socat x86_64 1.7.3.2-2.el7 base 290 k
Transaction Summary
==================================================================================================================
Install 1 Package (+1 Dependent package)
Total download size: 15 M
Installed size: 16 M
Is this ok [y/d/N]: y
Downloading packages:
(1/2): socat-1.7.3.2-2.el7.x86_64.rpm | 290 kB 00:00:00
(2/2): rabbitmq-server-3.8.9-1.el7.noarch.rpm | 15 MB 00:01:17
------------------------------------------------------------------------------------------------------------------
Total 201 kB/s | 15 MB 00:01:17
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : socat-1.7.3.2-2.el7.x86_64 1/2
Installing : rabbitmq-server-3.8.9-1.el7.noarch 2/2
Verifying : socat-1.7.3.2-2.el7.x86_64 1/2
Verifying : rabbitmq-server-3.8.9-1.el7.noarch 2/2
Installed:
rabbitmq-server.noarch 0:3.8.9-1.el7
Dependency Installed:
socat.x86_64 0:1.7.3.2-2.el7
Complete!
- 启用管理平台插件,启用插件后,可以可视化管理RabbitMQ。
[root@wechatserver software]# rabbitmq-plugins enable rabbitmq_management
- 启动RabbitMQ
[root@wechatserver software]# systemctl start rabbitmq-server
[root@wechatserver software]# systemctl status rabbitmq-server
- 访问RabbitMQ管理界面
注意要关闭虚拟机的防火墙:
[root@wechatserver software]# systemctl stop firewalld.service
[root@wechatserver software]# systemctl disable firewalld.service
另外RabbitMQ3.3以后,guest账号只能在本机登录。这里就不去修改相应配置了,而是另外创建其他登录账号。
①创建用户
创建用户名admin,密码123456的用户:
[root@wechatserver software]# rabbitmqctl add_user admin 123456
②设置admin为超级管理员
[root@wechatserver software]# rabbitmqctl set_user_tags admin administrator
③授权远程访问(也可以登录后,可视化配置)
[root@wechatserver software]# rabbitmqctl set_permissions -p / admin "." "." ".*"
④创建完成后,重启RabbitMQ
[root@wechatserver software]# systemctl restart rabbitmq-server
重新登陆Web页面
7. 管理RabbitMQ的几个命令
# 查看当前所有用户
$ sudo rabbitmqctl list_users
# 查看默认guest用户的权限
$ sudo rabbitmqctl list_user_permissions guest
# 由于RabbitMQ默认的账号用户名和密码都是guest。为了安全起见, 先删掉默认用户
$ sudo rabbitmqctl delete_user guest
# 添加新用户
$ sudo rabbitmqctl add_user username password
# 设置用户tag
$ sudo rabbitmqctl set_user_tags username administrator
# 赋予用户默认vhost的全部操作权限
$ sudo rabbitmqctl set_permissions -p / username ".*" ".*" ".*"
# 查看用户的权限
$ sudo rabbitmqctl list_user_permissions username
# checks if the local node is running and CLI tools can successfully authenticate with it
sudo rabbitmq-diagnostics ping
# prints enabled components (applications), TCP listeners, memory usage breakdown, alarms
# and so on
sudo rabbitmq-diagnostics status
# prints effective node configuration
sudo rabbitmq-diagnostics environment
# performs a more extensive health check of the local node
sudo rabbitmq-diagnostics node_health_check
- 日志文件和管理
默认RabbitMQ的日志路径位于/var/log/rabbitmq
。可以使用如下命令过滤RabbitMQ的运行过程
sudo journalctl --system | grep rabbitmq
logrotate是推荐的日志文件rotation和压缩方式。默认情况下,该软件包将设置logrotate使其每周在默认的/var/log/rabbitmq目录中的文件上运行 。rotation配置可以在/etc/logrotate.d/rabbitmq-server中找到。
至此,RabbitMQ安装配置完成。
3. 配置RabbitMQ(可选)
关于RabbitMQ的配置,可以下载RabbitMQ的配置模板rabbitmq.conf.example到/etc/rabbitmq/rabbitmq.config,然后按照需求更改即可。
关于每个配置项的具体作用,可以参考官方文档。
参考资料
- 《RabbitMQ实战指南》,朱忠华著
- RabbitMQ官方网站:https://www.rabbitmq.com/
- Kafka事务特性详解:https://www.jianshu.com/p/64c93065473e
- RabbitMQ GitHub仓库:https://github.com/rabbitmq/rabbitmq-server/tree/v3.8.x