使用過(guò)分布式中間件的人都知道,程序員使用起來(lái)并不復(fù)雜,常用的客戶端 API 就那么幾個(gè),比我們?nèi)粘>帉?xiě)程序時(shí)用到的 API 要少得多。但是分布式中間件在中小研發(fā)團(tuán)隊(duì)中使用得并不多,為什么會(huì)這樣呢? 原因是中間件的職責(zé)相對(duì)單一,客戶端的使用雖然簡(jiǎn)單,但整個(gè)環(huán)境搭起來(lái)卻不容易。所以對(duì)于系列中的幾篇中間件文章,我們重點(diǎn)放在解決門(mén)檻問(wèn)題,把服務(wù)端環(huán)境搭好(后期可云或運(yùn)維解決),把中間件的基本職責(zé)和功能介紹好,把客戶端 Demo 寫(xiě)好,讓程序員抬抬腳,在調(diào)試代碼中即可輕松入門(mén)。 根據(jù)我們以往幾年的經(jīng)驗(yàn),初次接觸也可以自主快速學(xué)習(xí),文章和 Demo 以實(shí)用為主,以下是消息隊(duì)列 RabbitMQ 的快速入門(mén)及應(yīng)用。 1、業(yè)務(wù)系統(tǒng)往往要求響應(yīng)能力特別強(qiáng),能夠起到削峰填谷的作用。 2、解耦:如果一個(gè)系統(tǒng)掛了,則不會(huì)影響另外個(gè)系統(tǒng)的繼續(xù)運(yùn)行。 3、業(yè)務(wù)系統(tǒng)往往有對(duì)消息的高可靠要求,以及有對(duì)復(fù)雜功能如 Ack 的要求。 4、增強(qiáng)業(yè)務(wù)系統(tǒng)的異步處理能力,減少甚至幾乎不可能出現(xiàn)并發(fā)現(xiàn)象: 使用消息隊(duì)列,就好比為了防汛而建葛洲壩,有大量數(shù)據(jù)的堆積能力,然后可靠地進(jìn)行異步輸出。例如: 傳統(tǒng)做法存在如下問(wèn)題,請(qǐng)見(jiàn)上圖: 1、一旦業(yè)務(wù)處理時(shí)間超過(guò)了定時(shí)器時(shí)間間隔,就會(huì)導(dǎo)致漏單。 2、如果采用新開(kāi)線程的方式獲取數(shù)據(jù),那么由于大量新開(kāi)線程處理,會(huì)容易造成服務(wù)器宕機(jī)。 3、數(shù)據(jù)庫(kù)壓力大,易并發(fā)。 使用 MQ 后的好處,請(qǐng)見(jiàn)上圖: 1、業(yè)務(wù)可注冊(cè)、可配置。 2、獲取數(shù)據(jù)規(guī)則可配置。 3、成功消費(fèi) MQ 中的消息才會(huì)被 Ack,提高可靠性。 4、大大增強(qiáng)了異步處理業(yè)務(wù)作業(yè)的能力: 定時(shí)從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)后,存入 MQ 消息隊(duì)列,然后 Job 會(huì)定期掃描 MQ 消息隊(duì)列,假設(shè) Job 掃描后先預(yù)取 5 條消息,然后異步處理這 5 條消息,也就是說(shuō)這 5 條消息可能會(huì)同時(shí)被處理。 RabbitMQ 是基于 AMQP 實(shí)現(xiàn)的一個(gè)開(kāi)源消息組件,主要用于在分布式系統(tǒng)中存儲(chǔ)轉(zhuǎn)發(fā)消息,由因高性能、高可用以及高擴(kuò)展而出名的 Erlang 語(yǔ)言寫(xiě)成。 其中,AMQP(Advanced Message Queuing Protocol,即高級(jí)消息隊(duì)列協(xié)議),是一個(gè)異步消息傳遞所使用的應(yīng)用層協(xié)議規(guī)范,為面向消息的中間件設(shè)計(jì)。 RabbitMQ 特點(diǎn)如下: 高可靠:RabbitMQ 提供了多種多樣的特性讓你在可靠性和性能之間做出權(quán)衡,包括持久化、發(fā)送應(yīng)答、發(fā)布確認(rèn)以及高可用性。 高可用隊(duì)列:支持跨機(jī)器集群,支持隊(duì)列安全鏡像備份,消息的生產(chǎn)者與消費(fèi)者不論哪一方出現(xiàn)問(wèn)題,均不會(huì)影響消息的正常發(fā)出與接收。 靈活的路由:所有的消息都會(huì)通過(guò)路由器轉(zhuǎn)發(fā)到各個(gè)消息隊(duì)列中,RabbitMQ 內(nèi)建了幾個(gè)常用的路由器,并且可以通過(guò)路由器的組合以及自定義路由器插件來(lái)完成復(fù)雜的路由功能。 支持多客戶端:對(duì)主流開(kāi)發(fā)語(yǔ)言(如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等)都有客戶端實(shí)現(xiàn)。 集群:本地網(wǎng)絡(luò)內(nèi)的多個(gè) Server 可以聚合在一起,共同組成一個(gè)邏輯上的 broker。 擴(kuò)展性:支持負(fù)載均衡,動(dòng)態(tài)增減服務(wù)器簡(jiǎn)單方便。 權(quán)限管理:靈活的用戶角色權(quán)限管理,Virtual Host 是權(quán)限控制的最小粒度。 插件系統(tǒng):支持各種豐富的插件擴(kuò)展,同時(shí)也支持自定義插件,其中最常用的插件是 Web 管理工具 RabbitMQ_Management,其 Web UI 訪問(wèn)地址: http://139.198.13.12:6233/, 登錄賬號(hào):flight,密碼:yyabc123。 消息從發(fā)送端到接收端的流轉(zhuǎn)過(guò)程即 RabbitMQ 的消息工作機(jī)制,請(qǐng)見(jiàn)下圖: 消息發(fā)送與接收的工作機(jī)制 共有 6 種基本用法:?jiǎn)螌?duì)單、單對(duì)多、發(fā)布訂閱模式、按路由規(guī)則發(fā)送接收、主題、RPC(即遠(yuǎn)程存儲(chǔ)調(diào)用)。我們將介紹單對(duì)單、單對(duì)多和主題的用法。 1、單對(duì)單:?jiǎn)伟l(fā)送、單接收。請(qǐng)見(jiàn)下圖。 2、單對(duì)多:一個(gè)發(fā)送端,多個(gè)接收端,如分布式的任務(wù)派發(fā)。請(qǐng)見(jiàn)下圖: 3、主題:Exchange Type 為 topic,發(fā)送消息時(shí)需要指定交換機(jī)及 Routing Key,消費(fèi)者的消息隊(duì)列綁定到該交換機(jī)并匹配到 Routing Key 實(shí)現(xiàn)消息的訂閱,訂閱后則可接收消息。只有消費(fèi)者將隊(duì)列綁定到該交換機(jī)且指定的 Routing Key 符合匹配規(guī)則,才能收到消息。 其中 Routing Key 可以設(shè)置成通配符,如:*或 #(*表示匹配 Routing Key 中的某個(gè)單詞,# 表示任意的 Routing Key 的消息都能被收到)。如果 Routing Key 由多個(gè)單詞組成,則單詞之間用. 來(lái)分隔。 命名規(guī)范: 交換機(jī)名的命名建議:Ex{AppID}.{自定義 ExchangeName},隊(duì)列名的命名建議:MQ{AppID}.{自定義 QueueName} 。 RabbitMQDemo 下載地址: https://github.com/das2017/RabbitMQDemo RabbitMQ 的官方網(wǎng)址: http://www. |
|