一、RabbitMQ简介
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 下面将重点介绍RabbitMQ中的一些基础概念,了解了这些概念,是使用好RabbitMQ的基础。
RabbitMQ 选型和对比:
1.从社区活跃度
按照目前网络上的资料,RabbitMQ
、activeM
、ZeroMQ
三者中,综合来看,RabbitMQ
是首选。
2.持久化消息比较
ZeroMq
不支持,ActiveMq
和RabbitMq
都支持。持久化消息主要是指我们机器在不可抗力因素等情况下挂掉了,消息不会丢失的机制。
3.综合技术实现
可靠性、灵活的路由、集群、事务、高可用的队列、消息排序、问题追踪、可视化管理工具、插件系统等等。
RabbitMq
/ Kafka
最好,ActiveMq
次之,ZeroMq
最差。当然ZeroMq
也可以做到,不过自己必须手动写代码实现,代码量不小。尤其是可靠性中的:持久性、投递确认、发布者证实和高可用性。
4.高并发
毋庸置疑,RabbitMQ
最高,原因是它的实现语言是天生具备高并发高可用的erlang
语言。
5.比较关注的比较, RabbitMQ 和 Kafka
RabbitMq
比Kafka
成熟,在可用性上,稳定性上,可靠性上, RabbitMq 胜于 Kafka(理论上)。
另外,Kafka
的定位主要在日志等方面, 因为Kafka
设计的初衷就是处理日志的,可以看做是一个日志(消息)系统一个重要组件,针对性很强,所以 如果业务方面还是建议选择 RabbitMq
。
还有就是,Kafka
的性能(吞吐量、TPS
)比RabbitMq
要高出来很多。
官网:https://www.rabbitmq.com/
RabbitMQ 兼容Erlang:
https://www.rabbitmq.com/which-erlang.html#compatibility-matrix
二、RabbitMQ 安装
文档:https://www.rabbitmq.com/install-rpm.html#bintray
- YUM安装
前置条件安装:Erlang20.3+版本
# 测试
[root@localhost ~]# erl
Erlang R16B03-1 (erts-5.10.4) [source] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V5.10.4 (abort with ^G)
1>
# 导入key
[root@localhost ~]# rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
# 创建repo 文件
[root@localhost ~]# vi /etc/yum.repos.d/rabbitmq.repo
# 内容
[bintray-rabbitmq-server]
name=bintray-rabbitmq-rpm
baseurl=https://dl.bintray.com/rabbitmq/rpm/rabbitmq-server/v3.7.x/el/7/
gpgcheck=0
repo_gpgcheck=0
enabled=1
# 安装
[root@localhost ~]# yum install rabbitmq-server
- 下载安装
暂无
- 启动
# 启动RabbitMQ服务
[root@localhost ~]# systemctl start rabbitmq-server
# 查看RabbitMQ服务状态
[root@localhost ~]# systemctl status rabbitmq-server
● rabbitmq-server.service - RabbitMQ broker
Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; disabled; vendor preset: disabled)
Active: active (running) since 五 2019-09-27 16:22:30 CST; 21s ago
Main PID: 18868 (beam.smp)
Status: "Initialized"
CGroup: /system.slice/rabbitmq-server.service
├─18868 /usr/lib/erlang/erts-9.3.3.11/bin/beam.smp -W w -A 64 -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -K true -- -ro...
├─19036 /usr/lib/erlang/erts-9.3.3.11/bin/epmd -daemon
├─19210 erl_child_setup 32768
├─19235 inet_gethost 4
└─19236 inet_gethost 4
9月 27 16:22:30 localhost rabbitmq-server[18868]: ## ##
9月 27 16:22:30 localhost rabbitmq-server[18868]: ## ## RabbitMQ 3.7.18. Copyright (C) 2007-2019 Pivotal Software, Inc.
9月 27 16:22:30 localhost rabbitmq-server[18868]: ########## Licensed under the MPL. See https://www.rabbitmq.com/
9月 27 16:22:30 localhost rabbitmq-server[18868]: ###### ##
9月 27 16:22:30 localhost rabbitmq-server[18868]: ########## Logs: /var/log/rabbitmq/rabbit@localhost.log
9月 27 16:22:30 localhost rabbitmq-server[18868]: /var/log/rabbitmq/rabbit@localhost_upgrade.log
9月 27 16:22:30 localhost rabbitmq-server[18868]: Starting broker...
9月 27 16:22:30 localhost rabbitmq-server[18868]: systemd unit for activation check: "rabbitmq-server.service"
9月 27 16:22:30 localhost systemd[1]: Started RabbitMQ broker.
9月 27 16:22:30 localhost rabbitmq-server[18868]: completed with 0 plugins.
# 重启RabbitMQ服务
[root@localhost ~]# systemctl restart rabbitmq-server
# 停止RabbitMQ服务
[root@localhost ~]# systemctl stop rabbitmq-server
# 加入开机自启
systemctl enable rabbitmq-server.service或chkconfig rabbitmq-server on
- 主要端口
4369 -- erlang发现口
5672 --client端通信口
15672 -- 管理界面ui端口
25672 -- server间内部通信口
三、Web UI管理消息服务器
- 启用插件
# 启用插件
[root@localhost ~]# rabbitmq-plugins enable rabbitmq_management
Enabling plugins on node rabbit@localhost:
rabbitmq_management
The following plugins have been configured:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch
Applying plugin configuration to rabbit@localhost...
The following plugins have been enabled:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch
set 3 plugins.
Offline change; changes will take effect at broker restart.
- Web访问
http://192.168.77.132:15672/
用默认的guest/guest即可(guest/guest用户只能从localhost地址登录,如果要配置远程登录,必须另创建用户) - 添加远程管理账户
出于安全考虑,guest这个默认的用户只能通过http://localhost:15672来登录,其他的IP无法直接用这个guest帐号。
使用以下命令添加用户。
# 添加帐号密码:
# rabbitmqctl add_user 用户名 密码
[root@localhost ~]# rabbitmqctl add_user admin 123456
Adding user "admin" ...
# 赋予其administrator角色
[root@localhost ~]# rabbitmqctl set_user_tags admin administrator
Setting tags for user "admin" to [administrator] ...
# 设置权限
[root@localhost ~]# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
Setting permissions for user "admin" in vhost "/" ...
# 重启rabbitmq
[root@localhost ~]# systemctl restart rabbitmq-server
四、六种工作模式
简单模式:一个生产者,一个消费者
work模式:一个生产者,多个消费者,每个消费者获取到的消息唯一。
订阅模式:一个生产者发送的消息会被多个消费者获取。
路由模式:发送消息到交换机并且要指定路由key ,消费者将队列绑定到交换机时需要指定路由key
topic模式:将路由键和某模式进行匹配,此时队列需要绑定在一个模式上,“#”匹配一个词或多个词,“*”只匹配一个词。
如果队列中ready状态的消息数比较多,可以认为是消费者的处理能力不足,可以通过增加消费者来解决,而unacked消息存在基本是有以下两点原因:
- 消费者取走消息后没有及时做消息确认,对于开启手动确认机制的,不进行ack则消息会一直以unacked状态留在队列中。
- 消费者处理能力不足。生产者投放消息的速度较快,当消费者按照prefetch_count设置的值取走相应数量的消息时,这些消息都会暂时处于unacked状态。
五、常见问题
- 没有可用软件包 rabbitmq-server-3.7.18-1.el7.noarch.rpm。
解决:
禁用fastestmirror插件
# 修改插件配置文件
[root@localhost ~]# vi /etc/yum/pluginconf.d/fastestmirror.conf
# 内容
[main]
# 将1改为0
enabled=0
verbose=0
always_print_best_host = true
socket_timeout=3
# Relative paths are relative to the cachedir (and so works for users as well
# as root).
hostfilepath=timedhosts.txt
maxhostfileage=10
maxthreads=15
#exclude=.gov, facebook
#include_only=.nl,.de,.uk,.ie
# 修改yum 配置文件
[root@localhost ~]# vi /etc/yum.conf
# 内容
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
# 修改为0 不使用插件
plugins=0
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
# 清除缓存并重新构建yum 源
[root@localhost ~]# yum clean all
# 更新cache
[root@localhost ~]# yum makecache
- 更改yum镜像
附:
centos7 修改为阿里的yum源
# 备份本地yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak
# 获取阿里yum源配置文件
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 清除缓存
yum clean all
# 更新cache
yum makecache
# 安装
yum -y update
- erlang 版本过低
错误:软件包:rabbitmq-server-3.7.18-1.el7.noarch (bintray-rabbitmq-server)
需要:erlang >= 20.3
已安装: erlang-R16B-03.18.el7.x86_64 (@epel)
erlang = R16B-03.18.el7
解决:
# 移除erlang
[root@localhost ~]# yum remove erlang
# 重新安装Erlang