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