分布式消息系统尝试(rabbitmq, celery, redis)

udzw3018 9年前

来自: 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
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
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
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>