分布式消息系統嘗試(rabbitmq, celery, redis)

來自: http://python.jobbole.com/84298/

最近在調整游戲的后臺架構,之前因為需要快速出產品,所以整個代碼都揉成一團,也基本沒有做任何分層處理。現在服務器端的開發也開始逐漸招進來,所以打算打算換一套統一的架構,以后做新游戲只要做其中的業務邏輯即可。

其實之前在騰訊的時候,基本不會用到message queue這種,所有的分布式處理都是由自己寫c++ server來互相通信的。這樣的處理雖然開發量稍微大一點,但是性能和靈活性確實很高。

現在自己在外面做,雖然自己已經封裝了一套server的框架出來,但是畢竟還有太多的輪子需要自己制造,所以就想到了之前一直有了解過celery,來看一下這種基于message queue的任務系統能達到什么性能。

RabbitMQ

celery 首推的mq是 rabbitmq ,所以需要先安裝一下:

在mac下用brew 安裝:

Python

brew install rabbitmq
brewinstallrabbitmq
</div>

安裝成功之后,即可啟動server了。

不過在這之前,我們先把后臺管理的插件打開:

Python

rabbitmq-plugins enable rabbitmq_management
rabbitmq-pluginsenablerabbitmq_management
</div>

之后執行如下命令,啟動server:

Python

rabbitmq-server
rabbitmq-server
</div>

這個時候就可以通過 http://127.0.0.1:15672/ 來訪問后臺管理端了,默認的用戶名和密碼是guest guest,可以自己在頁面上修改。截圖如下:

Redis

celery也支持redis作為broker和backend,所以redis也需要安裝一下,這里就不贅述了

Celery

安裝命令為:

Python

pip install celery
pipinstallcelery
</div>

性能測試

新建 t.py:

Python

from celery import Celery

app = Celery(backend='amqp', broker='amqp://')

@app.task def add(x, y): return x + y</pre>

from celeryimport Celery
 
app = Celery(backend='amqp', broker='amqp://')
 
@app.task
def add(x, y):
    return x + y
</div>

以及測試文件 test.py:

Python

import time
from t import add

t1 = time.time() result = add.delay(1, 2) print result.get()

print time.time() - t1</pre>

import time
from t import add
 
t1 = time.time()
result = add.delay(1, 2)
print result.get()
 
print time.time() - t1
</div>

啟動celery worker:

Python

celery -A t worker --loglevel=info -c 2
celery -A t worker --loglevel=info -c 2
</div>

執行 python test.py 輸出結果為:

Python

0.545017004013
0.545017004013
</div>

修改 t.py 為:

Python

from celery import Celery

app = Celery(backend='redis', broker='redis://')

@app.task def add(x, y): return x + y</pre>

from celeryimport Celery
 
app = Celery(backend='redis', broker='redis://')
 
@app.task
def add(x, y):
    return x + y
</div>

測試結果為:

Python

0.603708028793
0.603708028793
</div>

無論是rabbitmq還是redis,性能都慢的讓人無法接受,最終還是放棄了用celery做任務分布的想法,還是老老實實的用server通信吧。

</div>

 本文由用戶 udzw3018 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!