1. 程式人生 > >rabbitmq 和celery (分散式訊息佇列)

rabbitmq 和celery (分散式訊息佇列)

一、 安裝RabbitMQ:

1、RabbitMQ  (MAC )(訊息佇列工具,在celery中扮演broker的角色,broker是訊息代理,或者叫做訊息中介軟體)

(1)使用brew來安裝    

brew install rabbitmq
或者官網下載: http://www.rabbitmq.com/install-standalone-mac.html

(2)啟動

進入安裝目錄  $ sbin/rabbitmq-server

(3)rabbitmq的python客戶端,最常用的客戶端是 pika

$ pip install pika 

(4)通過WEB 和 REST API 管理 RabbitMQ

安裝外掛: $ sudo ./rabbitmq-plugins enable rabbitmq_management

web 預設埠是15672 , 預設賬號和初始密碼都是guest

(5)故障轉移:一般使用 HAProxy做RabbitMQ叢集的負載均衡工具,當叢集節點出現故障時,由應用程式決定故障轉移方式,最簡單的方式就是讓消費者重試。

while 1:
    try:
        connection = pika.BlockingConnection(parameters)
    except:
        pass

二、使用Celery (非同步任務的排程工具)

      簡單來說,rabbitmq是一個採用Erlang寫的強大的訊息佇列工具。在celery中可以扮演broker的角色。那麼什麼是broker?

      broker是一個訊息傳輸的中介軟體,可以理解為一個郵箱。每當應用程式呼叫celery的非同步任務的時候,會向broker傳遞訊息,而後celery的worker將會取到訊息,進行對於的程式執行。好吧,這個郵箱可以看成是一個訊息佇列。那麼什麼又是backend,通常程式傳送的訊息,發完就完了,可能都不知道對方時候接受了。為此,celery實現了一個backend,用於儲存這些訊息以及celery執行的一些訊息和結果。對於 brokers,官方推薦是rabbitmq和redis,至於backend,就是資料庫啦。為了簡單起見,我們都用redis。 (1)celery 的架構


celery beat: 任務排程器,beat程序會讀取配置檔案的內容,週期性的將配置中到期需要執行的任務傳送給任務佇列。 celery worker: 執行任務的消費者,通常會在多臺伺服器執行多個消費者 來提高執行效率。 broker: 訊息代理,或者叫做訊息中介軟體,接受任務生產者傳送過來的任務訊息,存進佇列再按序分發給任務消費方(通常是訊息佇列或者資料庫) producer: 呼叫了celery提供的API、函式或者裝飾器而產生任務並交給任務佇列處理的都是任務生產者。 result backend: 任務處理完後儲存狀態資訊和結果,以供查詢。celery預設已支援redis、 rabbitmq、 mongoDB、django ORM等方式

(2)celery使用場景:

  • web應用。當用戶觸發的一個操作需要較長時間才能執行完成時,可以把它作為任務交給celery去非同步執行,執行完成後再返回給使用者。
  • 定時任務。生產環境經常會有一些定時任務。
  • 其他可以非同步執行的任務。比如傳送訊息/ 郵件、推送訊息、清理/設定快取等。

(3)安裝celery,提供了bundles方式,也就是安裝celery 的同事可以一起安裝多種依賴。

pip install "celery[librabbitmq,redis,msgpack]"

(4)使用celery