首页 文章

Celery:使用PostgreSQL而不是RabbitMQ

提问于
浏览
2

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

例如:我想使用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/

2 回答

  • 5

    是的,你可以使用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
    

    排队任务

    In [1]: from demo import add
    
    In [2]: add.delay(1,2)
    Out[2]: <AsyncResult: 4853190f-d355-48ae-8aba-6169d38fad39>
    

    Worker 结果:

    [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
    

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

  • 1

    是否可以使用与芹菜不同的消息代理?

    在版本4之前,确定是的!在official document之后,我曾经在Celery 3中使用mongodb作为消息代理 .

    所以如果想使用PostgreSQL作为代理,没关系,Celery也支持SQLAlchemy .

    但是,如果你想在Celery 4.0中使用它,也许它有点困难,我想到的一种方法是改变Kombu的代码,是的,它是Kombu,而不是Celery!

相关问题