【问题标题】:Celery: Use PostgreSQL instead of RabbitMQCelery:使用 PostgreSQL 而不是 RabbitMQ
【发布时间】:2018-05-08 11:41:21
【问题描述】:

是否可以在 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/

【问题讨论】:

标签: postgresql rabbitmq celery


【解决方案1】:

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

工人结果:

[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)版本上测试。

【讨论】:

  • 使用 postgre 比 rabbitMQ 有优势吗?
  • @pelos 是的。减少堆栈中另一个组件的维护/部署开销。但是,如果您有高工作负载,建议不要使用 db 作为代理。相关讨论github.com/celery/celery/issues/5149
  • 这不再起作用了。在最近的 Celery 版本中,您不能将数据库用作代理。
  • @RamyM.Mousa 您使用的是哪个版本? celery==5.0.0 似乎也可以正常工作。
【解决方案2】:

是否可以在 celery 中使用不同的消息代理?

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

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

但是,如果你想在 Celery 4.0 中使用它,可能会有点困难,我认为一种方法是更改​​ Kombu 的代码,是的,它是 Kombu,而不是 Celery!

【讨论】:

    猜你喜欢
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 2019-12-27
    • 2016-07-13
    • 1970-01-01
    相关资源
    最近更新 更多