Celery:使用PostgreSQL而不是RabbitMQ

gue*_*tli 4 postgresql rabbitmq celery

可以在芹菜中使用不同的消息代理吗?

例如:我想使用PostgreSQL而不是RabbitMQ.

AFAIK只在结果后端支持:http://docs.celeryproject.org/en/latest/userguide/configuration.html#database-backend-settings

从PostgreSQL 9.5开始SKIP LOCKED,可以实现强大的消息/工作队列.请参阅https://blog.2ndquadrant.com/what-is-select-skip-locked-for-in-postgresql-9-5/

Chi*_*and 8

是的,你可以使用postgres作为经纪人而不是rabbitmq.这是一个演示它的简单示例.

from celery import Celery 


broker = 'sqla+postgresql://user:pass@host/dbname'

app = Celery(broker=broker)

@app.task
def add(x, y):
    return x + y
Run Code Online (Sandbox Code Playgroud)

排队任务

In [1]: from demo import add

In [2]: add.delay(1,2)
Out[2]: <AsyncResult: 4853190f-d355-48ae-8aba-6169d38fad39>
Run Code Online (Sandbox Code Playgroud)

工人结果:

[2017-12-02 08:11:08,483: INFO/MainProcess] Received task: t.add[809060c0-dc7e-4a38-9e4e-9fdb44dd6a31]  
[2017-12-02 08:11:08,496: INFO/ForkPoolWorker-1] Task t.add[809060c0-dc7e-4a38-9e4e-9fdb44dd6a31] succeeded in 0.0015781960000822437s: 3
Run Code Online (Sandbox Code Playgroud)

测试了最新版本(celery == 4.1.0,kombu == 4.1.0,SQLAlchemy == 1.1.1).

  • @pelos 是的。堆栈中另一个组件的维护/部署开销更少。但是,如果工作负载较高,建议不要使用 db 作为代理。相关讨论https://github.com/celery/celery/issues/5149。 (4认同)
  • 使用postgre比rabbitMQ有优势吗? (2认同)