一、認(rèn)識RabbitMQ及用途
Message Queue(MQ)
相對于一些大點的公司都會使用這個MQ,比如像kafka,rabbitmq,activeMQ,rocketMQ主要用于系統(tǒng)與系統(tǒng)之間,或者程序與程序之間進行數(shù)據(jù)的傳遞,那么作為消息中間件,我們可以將它作為消息代理服務(wù)器,最主要的就是作用就是系統(tǒng)之間的信息進行”結(jié)藕“,MQ是數(shù)據(jù)可靠性的重要保障。
那么說起mq的作用之前呢,比如我們以前會遇到什么問題?
1)比如說現(xiàn)在我們有兩個系統(tǒng),一個系統(tǒng)A,一個系統(tǒng)B,那么這兩個系統(tǒng)可以把它理解成一個訂單系統(tǒng),一個是后臺的支付系統(tǒng),那么這兩個系統(tǒng)之間,你調(diào)用我的,我調(diào)用你的,也就是數(shù)據(jù)之間進行一個相互的傳遞。 那么按照之前的做法來說,來回的傳遞,就出現(xiàn)問題了,比如說,不管是a系統(tǒng)還是b系統(tǒng)中間任何一個系統(tǒng)出現(xiàn)了問題,我們的消息就發(fā)送不出去了,那么像碰到這種情況下,我們就需要額外的去編寫一些程序,來保證我們的消息成功送達,比如說增加緩存,增加重試次數(shù),這就需要額外的編碼,這就需要編碼的工作量也是不小的。
2)另外就是數(shù)據(jù)傳遞過程中,這兩個系統(tǒng)都是java開發(fā)的還好,比如一個是java開發(fā)的一個是python開發(fā)的,那么在這兩個系統(tǒng)之間進行數(shù)據(jù)傳遞的過程中,那么麻煩就很大了,在這里面平臺不一樣語言不一樣,進行傳遞的接口也不一樣,這在我們無形中帶來了很大的問題。
3)對于系統(tǒng)a與系統(tǒng)b之間如果系統(tǒng)出現(xiàn)了問題,我們甚至都不知道是什么原因造成的,比如系統(tǒng)a接口變了,導(dǎo)致系統(tǒng)b接收不到哪些,系統(tǒng)b不知道出現(xiàn)哪些問題,我們沒辦法對問題進行切全,那么在線上調(diào)試與運維的過程中,這也是一個必然災(zāi)難性的后果。
綜上所述的話,直接調(diào)用的話稱為藕嚴(yán)重的耦合,這兩個缺了哪一個都不能正常工作,那么怎么解決呢,這個時候就需要mq去解決了。
所以mq叫做消息代理服務(wù)器,可以看到上面的mq的基本架構(gòu)圖系統(tǒng)a與系統(tǒng)b不再直接通信,中間增加了一臺MQ的消息代理服務(wù)器,所有的消息都往這個消息代理服務(wù)器上去發(fā)送,那么這個消息代理服務(wù)器本身來說它具備了一些高可用,高并發(fā)的特性,可以估且的認(rèn)為它是非常穩(wěn)定的,至少比我們開發(fā)的系統(tǒng)來說要穩(wěn)定的多的多,不用擔(dān)心當(dāng)機,無法提供服務(wù),那么在這個基礎(chǔ)之上,所有的系統(tǒng)把這個消息放出去,再由這個消息服務(wù)器,根據(jù)數(shù)據(jù)的情況分別的轉(zhuǎn)發(fā)或者分發(fā)
那么我們數(shù)據(jù)傳遞的目的,那么這么做有這么一個好處
首先我們系統(tǒng)之間不再進行之間的通信,那么它就完成這個節(jié)藕的工作,它完全面向一個中間人來做
其二的話MQ它是一個國際的標(biāo)準(zhǔn),它在底層遵循一個叫做amqp高級消息隊列協(xié)議,那么在這個底層的話因為它是一個國際標(biāo)準(zhǔn),因此系統(tǒng)a與系統(tǒng)b,我們不管是什么樣的系統(tǒng)開發(fā)的,只要遵循了數(shù)據(jù)傳輸?shù)囊?guī)范,那么就可以在這里面完成通過mq進行數(shù)據(jù)的傳遞,這是數(shù)據(jù)統(tǒng)一的協(xié)議,另外就是數(shù)據(jù)切全的過程,那么在切全的過程中,你會發(fā)現(xiàn),我們估且認(rèn)為mq這是一個穩(wěn)定的服務(wù)。系統(tǒng)a與系統(tǒng)b進行數(shù)據(jù)傳輸,如果系統(tǒng)a把數(shù)據(jù),送到mq里面,那么系統(tǒng)a的任務(wù)就完成了,至于系統(tǒng)b把我們的數(shù)據(jù)拿走,那是系統(tǒng)b的事,那么系統(tǒng)a的事完成了,那么如果真的出現(xiàn)了問題,比如運維工程師發(fā)現(xiàn)這個程序沒有執(zhí)行,那么看著系統(tǒng)a發(fā)送成功了,那么剩下的問題就是連帶mq,到系統(tǒng)b這一塊進行一個處理與跟蹤,那么mq并提供強大的圖形化管理頁面,我們可以輕易的將之前發(fā)送的數(shù)據(jù)進行跟蹤與管理。這也是非常的重要
那么說到mq,它有這么一個好的特性,可以總結(jié)一句話,mq解決了在這個系統(tǒng)之間進行數(shù)據(jù)傳遞的耦合性問題,使用mq幾乎適用于我們所有的系統(tǒng)調(diào)用或者是分布式項目
二、什么是RabbitMQ?
在我們市場上有各種各樣的mq,但是rabbitmq是全世界最火的開源消息代理服務(wù)器,在全世界擁有超過35000個項目部署在rabbitmq,用的人多,而且解決一些相關(guān)的問題也就很快,這個rabbit英文翻譯為兔子,這個也是一個整個消息中間件的龍頭老大,也就是我們使用rabbitmq很多的方案不用自己去考慮,因為全世界的工程師都為這個rabbitmq添磚加瓦,那么這個rabbitmq的最新版本的是3.8.2
而且rabbitmq支持幾乎所有的操作系統(tǒng)與編程語言,提供了高并發(fā),高可用的成熟方案,支持多種消息協(xié)議,易于部署與使用
官方地址:https://www.rabbitmq.com/
Rabbitmq與其他MQ的對比
像activemq和kafka都是apache的子成員,而rocketmq是阿里巴巴推行的消息中間件,也是作為一個apache的子項目
從這張表看出這個rabbitmq是用的最多的這個毋庸置疑,一般使用中遇到的問題,在它們的論壇以及百度中都可以找到相關(guān)的解決方案,另外就是kafka由于大數(shù)據(jù)的應(yīng)用也比較多,應(yīng)用比較多,逐漸的也已經(jīng)替代了activemq,像rocketmq一般應(yīng)用的都在國內(nèi)一般比較多,另外都支持這些數(shù)據(jù)保存到磁盤上,并發(fā)吞吐量就是每秒可以處理多少數(shù)據(jù),在不同的設(shè)計與不同的背景當(dāng)中,它的結(jié)果也是完全不同的,這里最高的是kafka,因為是大數(shù)據(jù)的領(lǐng)域,也是因為高性能引起了很多大數(shù)據(jù)工程師的注意,并發(fā)量在rocketmq中也是極高的,因為像雙十一這么大的并發(fā)量rocket扛住了,它在底層的優(yōu)化也是做的很好的,在并發(fā)吞吐量rabbitmq就稍微遜色一些,rabbitmq在數(shù)據(jù)可靠性的問題上做了很大的努力,它保證在這里數(shù)據(jù)是非??煽康模彩菢O高的,另外就是生態(tài)完整度,在周邊做了一些相關(guān)的,比如UI或者路由分發(fā)等,用戶總量也是rabbitmq最多,其次就是kafka,應(yīng)用場景,由于極高的數(shù)據(jù)可靠性,rabbitmq主要用于高可靠的交易系統(tǒng)當(dāng)中,activemq用于一些比較傳統(tǒng)的消息傳遞當(dāng)中,kafka一般使用最多也是使用日志處理大數(shù)據(jù)應(yīng)用這一塊,而rocketmq一般主要用于阿里巴巴內(nèi)部比較多一點,像雙十一就是使用的rocketmq,主要適用于互聯(lián)網(wǎng)高并發(fā),高可用這一塊,但是這一塊,在阿里也開源了很多的比如dubbo,當(dāng)時也停止更新了,然后恢復(fù)的,像這一塊我們社區(qū)的完整性和開源是極其不利的,像阿里有款分布式數(shù)據(jù)庫叫OceanBase,由淘寶核心系統(tǒng)研發(fā)部、運維、DBA、廣告、應(yīng)用研發(fā)等部門共同完成。也是對mysql數(shù)據(jù)庫底層進行了二次開發(fā),但是用著用著就閉源了,所以擔(dān)心阿里會閉源rabbitmq,在國內(nèi)的開源軟件來說,現(xiàn)在能做的很好的不是特別多,對于rocketmq未來是閉源商用還是繼續(xù)開源,那么現(xiàn)在還是屬于一個觀望的態(tài)度,現(xiàn)在目前看到rocketmq在apache的star是5000多星,只能說是中規(guī)中矩。
RabbitMQ的應(yīng)用場景
異構(gòu)系統(tǒng)的數(shù)據(jù)傳遞:什么叫異構(gòu)系統(tǒng),就是現(xiàn)在有兩個系統(tǒng)彼此要傳遞數(shù)據(jù),一個用java一個用c開發(fā)的,一¥個在天津一個在北京,像這種不在一個地區(qū)又是不同語言開發(fā)的系統(tǒng)叫做異構(gòu)系統(tǒng),像這種異構(gòu)系統(tǒng)利用mq進行數(shù)據(jù)的傳遞是不錯的選擇,但是遇到海量的數(shù)據(jù),但是不建議使用mq進行去傳遞,一般mq擅長傳遞小規(guī)模的數(shù)據(jù)。
高并發(fā)程序的流量控制:比如像阿里的雙十一進行秒殺的時候或者進行系統(tǒng)最忙碌的時候,進行流量控制的時候,削峰,平谷,像這種應(yīng)用用mq做肯定沒問題,mq是采用對列的機制,那么只允許同一時間有多少人進去,那么在這里是使用mq進行控制的。
基于p2p,p2ppp的程序:mq本身支持定閱和發(fā)布的模式或者是進行點對點消費的模式,比如使用mq進行點對點的開發(fā),比如像自己寫的qq,像微信,點對點通信,我們可以使用mq進行分發(fā),另外就是p2ppp的程序的話,也非常適合就像我們程序底層的時候,大家看過愛奇藝什么的,那么比如喜歡一個人的頻道,直接點一下關(guān)注,那么到這個人節(jié)目有更新的時候,馬上訂閱的人都能收到它的最新的消息,這就是通過mq的訂閱與發(fā)布,這些都是mq的天生所在。
分布式系統(tǒng)的事務(wù)一致性TCC:分布式事務(wù)是我們開發(fā)過程中最撓頭的問題,比如說什么是分布式事務(wù),現(xiàn)在有5個系統(tǒng),這5個系統(tǒng)的話要完成大的業(yè)務(wù),那么這個大的業(yè)務(wù),這5個系統(tǒng)每一個系統(tǒng)都完成了一小塊數(shù)據(jù),現(xiàn)在有需求來了,這5個系統(tǒng)要么全部都處理成功,要么中間有任何一個出現(xiàn)問題,我要把之前的系統(tǒng)信息全部都回滾什么都沒做過,那么這就是我們的說到的分布式事務(wù),那么分布式事務(wù)底層的話我們的設(shè)計叫tcc,那么在這里面最核心的就是基于mq進行消息的分發(fā),來通知我們的應(yīng)用,它進行提交回滾。
高可靠的交易系統(tǒng):在高可靠的交易系統(tǒng)中,rabbitmq最值得驕傲的是高可靠性,對于應(yīng)用來說mq本身就是高可靠性,同時對數(shù)據(jù)也進行了高可靠的支持,幾乎不會出現(xiàn)數(shù)據(jù)mq的層面上丟失的情況,那么在這種高可靠的交易系統(tǒng)來說,rabbitmq最適合不過了,任何一個多數(shù)據(jù)進行交互的兩個以上三個以上項目,進行數(shù)據(jù)傳遞用mq作為系統(tǒng)節(jié)藕的服務(wù)器是再合適不過的。
三、Linux平臺安裝最新RabbitMQ
RabbitMQ使用Erlang開發(fā)
Erlang(['?:l??])是一種通用的面向并發(fā)的編程語言, Erlang是一個結(jié)構(gòu)化,動態(tài)類型編程語言,內(nèi)建并行計算支持。
使用Erlang來編寫分布式應(yīng)用要簡單的多,Erlang運行時環(huán)境是一個虛擬機,有點像Java虛擬機,這樣代碼一經(jīng)編譯,同樣可以隨處運行。
下載地址:https://www.rabbitmq.com/download.html
直接下載最新的rabbitmq到本地
rabbitmq還需要依賴erlang的運行環(huán)境
https://www.erlang-solutions.com/resources/download.html
選擇centos,找到22.2.5最新的版本下載到本地
[root@zhaocheng ~]# mkdir rabbitmq
[root@zhaocheng rabbitmq]# ls
esl-erlang_22.2.5-2~centos~7_amd64.rpm rabbitmq-server-3.8.2-1.el7.noarch.rpm
--nodeps不檢查依賴,去除依賴關(guān)系
[root@zhaocheng rabbitmq]# rpm -ivh --nodeps esl-erlang_22.2.5-2~centos~7_amd64.rpm
[root@zhaocheng rabbitmq]# rpm -ivh --nodeps rabbitmq-server-3.8.2-1.el7.noarch.rpm
[root@zhaocheng rabbitmq]# rabbitmq-plugins enable rabbitmq_management
啟動控制臺
[root@zhaocheng rabbitmq]# rabbitmq-server
訪問http://ip:15672
登錄的時候3.3以上的版本都會出現(xiàn)User can only log in via localhost,是因為禁止使用guest/guest權(quán)限通過除localhost外的訪問
找到這個文件rabbit.app
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.7/ebin/rabbit.app
將:{loopback_users, [<<”guest”>>]},
改為:{loopback_users, []},
重啟服務(wù)
[root@zhaocheng ~]# rabbitmqctl stop
[root@zhaocheng ~]# rabbitmq-server
登錄:guest
密碼:guest
RabbitMQ常用命令
啟動與關(guān)閉
rabbitmq-server 前臺啟動
rabbitmq-server -detached 后臺啟動
rabbitmqctl stop 停止服務(wù)/kill -9 rbbitmq的pid
終止與啟動應(yīng)用
rabbitmqctl start_app 啟動應(yīng)用
rabbitmqctl stop_app 終止應(yīng)用
就是將我們的應(yīng)用進行啟動或者終止,這個不會對我們的進程產(chǎn)生影響,只是對我們的隊列服務(wù)進行了暫停,比如像一個電廠將這個電廠看作一個進程,比如電廠進行升級改造,需要拉閘,那么相當(dāng)于使用這個rabbitmqctl stop_app,恢復(fù)的話,使用start_app
用戶管理
創(chuàng)建一個用戶,比如叫kubernetes
格式:rabbitmqctl add_user {username} {password}
[root@zhaocheng ~]# rabbitmqctl add_user kubernetes 123456
Adding user "kubernetes" ...
刪除用戶
rabbitmqctl delete_user {username}
重置密碼,一般的話在部署rabbitmq的時候進行對guest用戶進行修改密碼,因為這個權(quán)限是非常大的
[root@zhaocheng ~]# rabbitmqctl change_password guest 123456789
Changing password for user "guest" ...
格式:rabbitmqctl change_password {username} {newpassword}
授予用戶角色(Tag),在rabbitmq中有四種基本的角色,對mq有不同的操作權(quán)限,這4種角色統(tǒng)一叫tag,可以針對我們創(chuàng)建的用戶給它一定的權(quán)限,這個tag也就是包含了一定相關(guān)的策略信息。
格式:rabbitmqctl set_user_tags {username} {tag}
[root@zhaocheng ~]# rabbitmqctl set_user_tags kubernetes administrator
Setting tags for user "kubernetes" to [administrator] ...
查看對我們的kubernetes用戶設(shè)置了權(quán)限為超級管理員
設(shè)置用戶允許訪問的vhost:訪問的虛擬主機,相當(dāng)于對應(yīng)mysql中對應(yīng)的數(shù)據(jù)庫,mysql可以把數(shù)據(jù)放在不同對應(yīng)的數(shù)據(jù)中,對數(shù)據(jù)進行分類,那么vhost也是一樣,可以對不同的系統(tǒng)進行設(shè)置不同的虛擬主機,通過set_permissions規(guī)定哪個用戶,可以訪問哪些虛擬主機,后面的星是能夠執(zhí)行所有的權(quán)限,第一個是配置權(quán)限,讀權(quán)限,寫權(quán)限,-p是虛擬主機的路徑
格式:rabbitmqctl set_permissions -p / user_admin '.' '.' '.'
給kubernetes用戶一個默認(rèn)的虛擬主機的操作權(quán)限,一般生產(chǎn)環(huán)境中會創(chuàng)建多個虛擬主機,進行一些相關(guān)的權(quán)限
[root@zhaocheng ~]# rabbitmqctl set_permissions -p / kubernetes '.' '.' '.'
Setting permissions for user "kubernetes" in vhost "/" ...
可以使用頁面上直接添加用戶
rabbitmq用戶四種tag
超級管理員(administrator):也就是進行對所有的用戶進行管理
可登陸管理控制臺(啟用management plugin的情況下),可查看所有 的信息,并且可以對用戶,策略(policy)進行操作。
監(jiān)控者(monitoring):可以查看rabbitmq節(jié)點的相關(guān)信息,是管理我們運行節(jié)點的運行狀態(tài)的
登陸管理控制臺(啟用management plugin的情況下),同時可以查看
rabbitmq節(jié)點的相關(guān)信息(進程數(shù),內(nèi)存使用情況,磁盤使用情況等)
策略制定者(policymaker):這個就無法查看我們節(jié)點的相關(guān)信息,但是可以進行一些策略的定制,比如在管理集群的時候,哪些隊列可以進行復(fù)制,或者運行的規(guī)則,規(guī)定了我們的節(jié)點是怎么運行的
可登陸管理控制臺(啟用management plugin的情況下), 同時可以對
policy進行管理。但無法查看節(jié)點的相關(guān)信息(上圖紅框標(biāo)識的部分)。
普通管理者(management)
僅可登陸管理控制臺(啟用management plugin的情況下),無法看到 節(jié)點信息,也無法對策略進行管理。
還有一個就是什么都沒寫的時候,沒有角色,連控制臺都無法登錄