Celery 運行在不同的server上

1.基本概況

近期項目進行橫向拓展會用到celery,于是開始研究celery的手冊。在看手冊的過程中發現,基本所有的官方例子都是運行在一臺設備上,按照例子很容易就調通了。但實際的運行環境中肯定是部署在不同的設備上。那么如何部署在兩個設備上呢?

2. 開始研究

  • 運行環境:
    2臺ubuntu虛擬機,網段分別為(192.168.140.100和192.168.140.101)
    celery+rabbitMQ
  • 代碼環境:
    (1)celery_master.py
#! /usr/bin/env python
# -*-coding:utf-8 -*-
import time
from celery import Celery
app = Celery('celery_worker', broker='amqp://guest@localhost//', backend='amqp://guest@localhost//')    

這里構建了一個celery中的application,其中broker采用本地rabbitMQ,賬戶為guest賬戶。這里的第一個參數要指定woker的名稱。
PS: 這里特別需要注意第一個參數,這個參數為__main__。

main
原手冊地址
Name of the __main__ module. Required for standalone scripts.
If set this will be used instead of __main__ when automatically generating task names.

根據這段話,其實說明白點就是要執行具體任務的入口函數的地址,這里相當于執行celery_worker.__main__。 這里有個問題,如果你使用的是task.delay,這種方式,則必須指定這個celery為‘celery_worker’,告訴系統執行的是‘celery_worker’中的add。這塊其實感覺比較混亂,總之,就是你要讓任務找到它的執行空間就行。如果你采用send_task去完成這個任務,這塊你的兩個app對象的第一個參數就不需要如此考究了,因為你可以在send_task指定執行的是哪個函數。
例如:

result = app.send_task('celery_worker.add', [1, 2])  

對端的工程目錄層級中包含一個‘celery_worker.py’的文件,里面有個add的函數。
這里推薦使用‘send_task’這種做法,這里為了展示Celery類實例化時候的第一個參數__main__的作用,完成了這種案例(不推薦這種寫法,只是說明可行)。

@app.task
def add(a, b):
    pass    

這個地方定義了一個函數,名叫add,接受兩個參數,但函數體里面為pass,其實這個很重要。很多人在寫celery_master和celery_work的時候把add原封不動的重新copy了一次,兩個文件中都實現了add函數。但其實,將任務分發過后,具體執行的add為celery_work中的add。這里我之所以寫一個pass的函數,其實相當于C語言中的函數聲明,因為發送任務的時候調用了add。

while (flag):
   print app.control.ping(timeout=0.5)  # 發送ping包,看是否能訪問目標地址
   result = add.delay(1, 2) # 發送具體的任務和值
   print "ID: %s" % result.id
   if result.failed():
       flag = False
   print "Flag: %s" % flag
   time.sleep(1)  

這段代碼很簡單,實現的功能就是每隔1分鐘發送給目標worker一個任務,任務為add,參數為1、2。
(2)celery_worker.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
from celery import Celery
app = Celery('who care', broker='amqp://guest@localhost//', backend='amqp://')

這里同樣構建了一個celery中的application,可以看出這里的第一個參數可以隨便設置。

@app.task
def add(a, b):
    print 'Start task'
    time.sleep(3)
    print 'Finish task'
    return a + b

具體的add邏輯,這里不用多解釋了吧。
以上就是整個代碼的部分。
為了驗證代碼能正常運行,將兩個代碼都放到192.168.140.100設備上。然后兩個終端,分別執行
celery -A celery_worker worker --loglevel=infopython celery_master.py就能看到它們在本地工作了。

3.問題來了

上面這個例子很明顯和官方文檔差不了多少,其實這里就是想告訴大家如何委婉的解決master和worker中關于具體任務函數該如何寫,當然還有其他方法,自行研究。
現在,問題的關鍵在于如何在不同的設備上分開部署celery_master和celery_worker。
先說一個問題,既然要部署在不同設備上,rabbitMQ是存在賬號這個說法的,之前用的guest賬號只能運行在localhost下。官方有明確說明("guest" user can only connect via localhost):http://www.rabbitmq.com/access-control.html
(1)登陸192.168.140.100機器,將celery_master.py拷貝到該機器,然后執行下面操作(http://stackoverflow.com/questions/25869858/celery-error-in-connecting-to-rabbitmq-server):
現在生成一個賬號密碼為test、test的 rabbitMQ賬號,以及一個test-vhost的virtual host。命令如下:
sudo rabbitmqctl add_user test test
sudo rabbitmqctl set_permissions -p test-vhost test ".*" ".*" ".*"
完成上訴兩個步驟候開始修改代碼:

app = Celery('celery_worker', broker='amqp://test:test@localhost/test-vhost', backend='amqp://')  

(2)登陸192.168.140.101機器,將celery_worker.py拷貝到該機器,然后執行下面操作:
修改代碼

app = Celery('who care', broker='amqp://test:test@192.168.140.100//', backend='amqp://')

完成上述步驟后,分別在兩個機器上啟動對應的指令:
192.168.140.100:python celery_master.py
192.168.140.101:celery -A celery_worker worker --loglevel=info
程序就會正常運作了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容