一、RabbitMQ簡(jiǎn)介
??AMQP,即Advanced Message Queuing Protocol,高級(jí)消息隊(duì)列協(xié)議,是應(yīng)用層協(xié)議的一個(gè)開(kāi)放標(biāo)準(zhǔn),為面向消息的中間件設(shè)計(jì)。消息中間件主要用于組件之間的解耦,消息的發(fā)送者無(wú)需知道消息使用者的存在,反之亦然。 AMQP的主要特征是面向消息、隊(duì)列、路由(包括點(diǎn)對(duì)點(diǎn)和發(fā)布/訂閱)、可靠性、安全。 RabbitMQ是一個(gè)開(kāi)源的AMQP實(shí)現(xiàn),服務(wù)器端用Erlang語(yǔ)言編寫(xiě),支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息,在易用性、擴(kuò)展性、高可用性等方面表現(xiàn)不俗。 下面將重點(diǎn)介紹RabbitMQ中的一些基礎(chǔ)概念,了解了這些概念,是使用好RabbitMQ的基礎(chǔ)。
RabbitMQ 選型和對(duì)比:
1.從社區(qū)活躍度
按照目前網(wǎng)絡(luò)上的資料,RabbitMQ 、activeM 、ZeroMQ 三者中,綜合來(lái)看,RabbitMQ 是首選。
2.持久化消息比較
ZeroMq 不支持,ActiveMq 和RabbitMq 都支持。持久化消息主要是指我們機(jī)器在不可抗力因素等情況下掛掉了,消息不會(huì)丟失的機(jī)制。
3.綜合技術(shù)實(shí)現(xiàn)
可靠性、靈活的路由、集群、事務(wù)、高可用的隊(duì)列、消息排序、問(wèn)題追蹤、可視化管理工具、插件系統(tǒng)等等。
RabbitMq / Kafka 最好,ActiveMq 次之,ZeroMq 最差。當(dāng)然ZeroMq 也可以做到,不過(guò)自己必須手動(dòng)寫(xiě)代碼實(shí)現(xiàn),代碼量不小。尤其是可靠性中的:持久性、投遞確認(rèn)、發(fā)布者證實(shí)和高可用性。
4.高并發(fā)
毋庸置疑,RabbitMQ 最高,原因是它的實(shí)現(xiàn)語(yǔ)言是天生具備高并發(fā)高可用的erlang 語(yǔ)言。
5.比較關(guān)注的比較, RabbitMQ 和 Kafka
RabbitMq 比Kafka 成熟,在可用性上,穩(wěn)定性上,可靠性上, RabbitMq 勝于 Kafka(理論上)。
另外,Kafka 的定位主要在日志等方面, 因?yàn)?code>Kafka 設(shè)計(jì)的初衷就是處理日志的,可以看做是一個(gè)日志(消息)系統(tǒng)一個(gè)重要組件,針對(duì)性很強(qiáng),所以 如果業(yè)務(wù)方面還是建議選擇 RabbitMq 。
還有就是,Kafka 的性能(吞吐量、TPS )比RabbitMq 要高出來(lái)很多。
官網(wǎng):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+版本
# 測(cè)試
[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>
# 導(dǎo)入key
[root@localhost ~]# rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
# 創(chuàng)建repo 文件
[root@localhost ~]# vi /etc/yum.repos.d/rabbitmq.repo
# 內(nèi)容
[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
- 下載安裝
暫無(wú)
- 啟動(dòng)
# 啟動(dòng)RabbitMQ服務(wù)
[root@localhost ~]# systemctl start rabbitmq-server
# 查看RabbitMQ服務(wù)狀態(tài)
[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服務(wù)
[root@localhost ~]# systemctl restart rabbitmq-server
# 停止RabbitMQ服務(wù)
[root@localhost ~]# systemctl stop rabbitmq-server
# 加入開(kāi)機(jī)自啟
systemctl enable rabbitmq-server.service或chkconfig rabbitmq-server on
- 主要端口
4369 -- erlang發(fā)現(xiàn)口
5672 --client端通信口
15672 -- 管理界面ui端口
25672 -- server間內(nèi)部通信口
三、Web UI管理消息服務(wù)器
- 啟用插件
# 啟用插件
[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訪問(wèn)
http://192.168.77.132:15672/
用默認(rèn)的guest/guest即可(guest/guest用戶只能從localhost地址登錄,如果要配置遠(yuǎn)程登錄,必須另創(chuàng)建用戶) - 添加遠(yuǎn)程管理賬戶
出于安全考慮,guest這個(gè)默認(rèn)的用戶只能通過(guò)http://localhost:15672來(lái)登錄,其他的IP無(wú)法直接用這個(gè)guest帳號(hào)。
使用以下命令添加用戶。
# 添加帳號(hào)密碼:
# 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] ...
# 設(shè)置權(quán)限
[root@localhost ~]# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
Setting permissions for user "admin" in vhost "/" ...
# 重啟rabbitmq
[root@localhost ~]# systemctl restart rabbitmq-server


四、六種工作模式
簡(jiǎn)單模式:一個(gè)生產(chǎn)者,一個(gè)消費(fèi)者
work模式:一個(gè)生產(chǎn)者,多個(gè)消費(fèi)者,每個(gè)消費(fèi)者獲取到的消息唯一。
訂閱模式:一個(gè)生產(chǎn)者發(fā)送的消息會(huì)被多個(gè)消費(fèi)者獲取。
路由模式:發(fā)送消息到交換機(jī)并且要指定路由key ,消費(fèi)者將隊(duì)列綁定到交換機(jī)時(shí)需要指定路由key
topic模式:將路由鍵和某模式進(jìn)行匹配,此時(shí)隊(duì)列需要綁定在一個(gè)模式上,“#”匹配一個(gè)詞或多個(gè)詞,“*”只匹配一個(gè)詞。
如果隊(duì)列中ready狀態(tài)的消息數(shù)比較多,可以認(rèn)為是消費(fèi)者的處理能力不足,可以通過(guò)增加消費(fèi)者來(lái)解決,而unacked消息存在基本是有以下兩點(diǎn)原因:
- 消費(fèi)者取走消息后沒(méi)有及時(shí)做消息確認(rèn),對(duì)于開(kāi)啟手動(dòng)確認(rèn)機(jī)制的,不進(jìn)行ack則消息會(huì)一直以u(píng)nacked狀態(tài)留在隊(duì)列中。
- 消費(fèi)者處理能力不足。生產(chǎn)者投放消息的速度較快,當(dāng)消費(fèi)者按照prefetch_count設(shè)置的值取走相應(yīng)數(shù)量的消息時(shí),這些消息都會(huì)暫時(shí)處于unacked狀態(tài)。
五、常見(jiàn)問(wèn)題
- 沒(méi)有可用軟件包 rabbitmq-server-3.7.18-1.el7.noarch.rpm。
解決:
禁用fastestmirror插件
# 修改插件配置文件
[root@localhost ~]# vi /etc/yum/pluginconf.d/fastestmirror.conf
# 內(nèi)容
[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
# 內(nèi)容
[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
# 清除緩存并重新構(gòu)建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 版本過(guò)低
錯(cuò)誤:軟件包: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