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