Rabbitmq學習之路1-基本概念

      最近項目中開始使用rabbitmq,之前只聽過可是沒使用過,因此有必要先系統的瞭解一下rabbitmq的使用方法。找管理員要了三臺機器作學習之用。 python

試驗環境 linux

     10.20.112.26  ubuntu12.04  ubuntuTest01 ubuntu

     10.20.112.27  ubuntu12.04  ubuntuTest02 安全

     10.20.112.28  ubuntu12.04  ubuntuTest03 服務器

先來看看怎麼安裝 分佈式

      官方提供了不少平臺的安裝包,win、debian、ubuntu、rhel都有相關的編譯好的安裝包,若是沒有支持你的平臺,則能夠選擇編譯安裝,像我這種懶人確定選擇官方提供好的編譯包了。 工具

安裝過程以下: 性能

修改/etc/apt/sources.list,追加rabbitmq的源信息 學習

deb http://www.rabbitmq.com/debian/ testing main

      不要被後面的testing迷惑,它並非相似linux發行版中的測試版本,只是用來強調rabbitmq發佈的很頻繁。 測試

下載源的校驗key,其實不用也能夠

wget http://www.rabbitmq.com/rabbitmq-signing-key-public.asc
sudo apt-key add rabbitmq-signing-key-public.asc

更新包信息,下載rabbitmq

apt-get update
apt-get install rabbitmq-server
       安裝過程如此方便啊。老版本的能夠到這來下載: http://www.rabbitmq.com/releases/rabbitmq-server/

修改三臺機器的/etc/hosts,追加以下信息

10.20.112.27 ubuntuTest02
10.20.112.26 ubuntuTest01
10.20.112.28 ubuntuTest03

下面粗略的瞭解一下rabbitmq的各類組件及原理

      RabbitMQ是實現AMQP(高級消息隊列協議)的消息中間件的一種,最初起源於金融系統,用於在分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。

      rabbitmq中有一些概念須要咱們在使用前先搞清楚,能夠吧rabbitmq看作由一系列組件搭配起來的一個工具,主要包括如下幾個:broker、exchange、queue、binding、routingkey、producter、consumer、channel。

1 Broker

     簡單來講就是消息隊列服務器的實體

2 Exchange

      接收消息,轉發消息到綁定的隊列上,指定消息按什麼規則,路由到哪一個隊列。若是沒有隊列綁定在exchange上面,那麼發送到exchange上面的消息會丟失,一個exchange能夠綁定多個隊列,一個隊列能夠被多個exchange綁定。聲明一個已經存在的exchange,只是賦予不一樣的類型,則會出現建立錯誤,客戶端須要刪除已經存在的exchange,而後從新建立新類型的exchange。 exchange的屬性,若是啓用持久性,則exchange在服務重啓前都有效,若是啓用自動刪除,則exchange在其綁定的queue都被刪除後會自動刪除掉自身

  經常使用類型的exchange:

      direct:轉發消息到routingkey指定的隊列,徹底根據key進行投遞的叫作Direct交換機,例如,綁定時設置了routing key爲」abc」,那麼客戶端提交的消息,只有設置了key爲」abc」的纔會投遞到隊列。

     topic:按照規則轉發消息,對key進行模式匹配後進行投遞的叫作Topic交換機,符號」#」匹配一個或多個詞,符號」*」匹配正好一個詞。例如」abc.#」匹配」abc.def.ghi」,」abc.*」只匹配」abc.def」。

     fanout:轉發消息到全部綁定的隊列,它採起廣播模式,一個消息進來時,投遞到與該交換機綁定的全部隊列。

3 Queue

     消息隊列載體,用來存儲消息,相同屬性的queue能夠重複定義,每一個消息都會被投入到一個或多個隊列。queue的屬性,若是啓用了持久性,則queue在服務重啓前都有效,若是啓用了自動刪除,則在全部消費則中止使用queue以後刪除自身,若是啓用排他性,則queue只能被聲明它的消費者使用。

4 Binding:綁定,它的做用就是把Exchange和Queue按照路由規則綁定起來。

5 RoutingKey:路由關鍵字,Exchange根據這個關鍵字進行消息投遞。

6 producter:消息生產者,產生消息的程序。

7 consumer:消息消費者,接收消息的程序。

8 Channel:消息通道,在客戶端的每一個鏈接裏可創建多個Channel,每一個channel表明一個會話任務。

RabbitMQ支持消息的持久化,也就是數據寫在磁盤上。主要包括三個部分:

1 exchange持久化,在聲明時指定durable => 1

2 queue持久化,在聲明時指定durable => 1

3 消息持久化,在投遞時指定delivery_mode => 2(1是非持久化)

      若是exchange和queue都是持久化的,那麼它們之間的binding也是持久化的。若是exchange和queue二者之間有一個持久化,一個非持久化,就不容許創建綁定。

消息隊列的使用過程大概以下:

1 客戶端鏈接到消息隊列服務器,打開一個channel。

2 客戶端聲明一個exchange,並設置相關屬性。

3 客戶端聲明一個queue,並設置相關屬性。

4 客戶端使用routing key,在exchange和queue之間創建好綁定關係。

5 客戶端投遞消息到exchange。

     exchange接收到消息後,就根據消息的key和已經設置的binding,進行消息路由,將消息投遞到一個或多個隊列裏。

rabbitmq的使用模式通常有三種:單機模式、集羣模式、鏡像模式

單機模式:

    rabbitmq服務運行在一臺機器上,使用很簡單。

集羣模式:

      對於queue來講,message data只存在於集羣中的一個節點上,而message metadata則存在於集羣中的全部節點。當message進入A節點的queue後,consumer從B節點拉去時,rabbitmq會臨時在A、B之間進行消息傳輸,把A中的message data取出來發送給連接在B上的consumer。這樣就存在A這個瓶頸,不管連接A仍是B,出口老是在A。還有若是A節點故障後,在B節點沒法取到A節點中還未消費的消息,若是作了消息持久化,則A節點恢復後,仍然能夠被消費,可是若是沒作消息持久化,即便A恢復了,消息也丟失了。

鏡像模式:

      該模式和集羣模式的區別在於,message data會在鏡像節點間主動同步,而不是在consumer取數據時臨時拉取,固然因爲在節點間主動同步數據,反作用也很明顯,下降系統性能,一但大量消息進入,則同步的消息很是多。

RabbitMQ的集羣節點包括內存節點、磁盤節點。顧名思義內存節點就是將全部數據放在內存,磁盤節點將數據放在磁盤。若是在投遞消息時,打開了消息的持久化,那麼即便是內存節點,數據仍是安全的放在磁盤。

相關文章
相關標籤/搜索