一.消息隊列概述安全
什麼是消息隊列?網絡
消息隊列中間件是分佈式系統中重要的組件,是在消息的傳輸過程當中保存消息的容器。多線程
爲何會須要消息隊列?架構
在高併發環境下,因爲來不及同步處理,請求每每會發生堵塞,好比說,大量的insert,update之類的請求同時到達MySQL,直接致使無數的行鎖表鎖,甚至最後請求會堆積過多,從而觸發too many connections錯誤。經過使用消息隊列,咱們能夠異步處理請求,從而緩解系統的壓力。關於使用消息隊列的系統與傳統系統的區別能夠參考這篇博文(傳送門)。併發
消息隊列應用場景異步
消息隊列主要解決應用解耦,異步消息,流量削鋒等問題,實現高性能,高可用,可伸縮和最終一致性架構。詳細能夠參考這篇文章(傳送門)。分佈式
二.消息服務的重要概念高併發
1.消息代理性能
當消息發送者發送消息之後,將由消息代理接管,消息代理保證信息傳遞到指定目的地。ui
2.目的地
1) 隊列(queue):點對點消息通訊(point-to-point)
— 消息發送者發送消息,消息代理將其放入一個隊列中,消息接收者從隊列中獲取消息內容,消息讀取後被移出隊列。
— 消息只有惟一的發送者和接受者,但並非只能有一個接收者。
2) 主題(topic): 發佈(publish) /訂閱(subscribe)消息通訊
— 發送者(發佈者)發送消息到主題,多個接收者(訂閱者) 監聽(訂閱)這個主題,那麼就會在消息到達時同時收到消息。
三.消息服務規範
1.JMS(Java Message Service) JAVA消息服務
— 基於JVM消息代理的規範。ActiveMQ、HornetMQ是JMS實現
只能應用於Java平臺,有多種消息類型。
2.AMQP(Advanced Message Queuing Protocol)
— 高級消息隊列協議,也是一個消息代理的規範,兼容JMS
— RabbitMQ是AMQP的實現
跨平臺,跨語言,將消息序列化後發送。
四.RabbitMQ簡介
1.簡介:RabbitMQ是一個由erlang開發的基於AMQP的開源實現,穩定性與可靠性十高,因此目前不少企業都在用它。
2.基本概念:
1). Message
消息。消息是不具名的,它由消息頭和消息體組成。消息體是不透明的,而消息頭則由一系列的可選屬性組成,這些屬性包括routing-key(路由鍵)、priority(相對於其餘消息的優先權)、delivery-mode(指出該消息可能須要持久性存儲)等。
2). Publisher
消息的生產者,也是一個向交換器發佈消息的客戶端應用程序
3). Exchange
message到達broker的第一站,根據分發規則,匹配查詢表中的routing key,分發消息到queue中去。經常使用的類型有:
direct (point-to-point):點對點模式,能夠精確地將消息發送給某一隊列。
fanout (multicast):廣播模式,發送時每個隊列都能接收到該消息。
topic (publish-subscribe) 模糊匹配的模式(發佈/訂閱),可使用#.news(#匹配0個或1個單詞)或*.news(*匹配任意單詞)。
4). Queue
消息最終被送到這裏等待consumer取走。一個message能夠被同時拷貝到多個queue中。
5). Binding
exchange和queue之間的虛擬鏈接,binding中能夠包含routing key。Binding信息被保存到exchange中的查詢表中,用於message的分發依據。
6). Connection
publisher/consumer和broker之間的TCP鏈接。斷開鏈接的操做只會在client端進行,Broker不會斷開鏈接,除非出現網絡故障或broker服務出現問題。
7). Channel
若是每一次訪問RabbitMQ都創建一個Connection,在消息量大的時候創建TCP Connection的開銷將是巨大的,效率也較低。Channel是在connection內部創建的邏輯鏈接,若是應用程序支持多線程,一般每一個thread建立單獨的channel進行通信,AMQP method包含了channel id幫助客戶端和message broker識別channel,因此channel之間是徹底隔離的。Channel做爲輕量級的Connection極大減小了操做系統創建TCP connection的開銷。
8). Consumer
消息的消費者。表示一個從消息隊列中取得消息的客戶端應用程序。
9). Virtual host
虛擬主機。出於多租戶和安全因素設計的,把AMQP的基本組件劃分到一個虛擬的分組中,相似於網絡中的namespace概念。當多個不一樣的用戶使用同一個RabbitMQ server提供的服務時,能夠劃分出多個vhost,每一個用戶在本身的vhost建立exchange/queue等。
10). Broker
接收和分發消息的應用,RabbitMQ Server就是Message Broker。
五.RabbitMQ運行機制