【问题标题】:Using Different Redis Database for Different Queues in Celery对 Celery 中的不同队列使用不同的 Redis 数据库
【发布时间】:2021-01-08 14:11:30
【问题描述】:

我有一个 Django 应用程序,它使用 CeleryRedis 代理来执行异步任务。目前,该应用有 3 个队列(和 3 个工作人员)连接到单个 Redis 实例进行通信。在这里,前两个工人是基于prefork的工人,第三个是一个基于gevent的工人。

有关代理和后端的 Celery 设置变量如下所示:

CELERY_BROKER_URL="redis://localhost:6379/0"
CELERY_RESULT_BACKEND="redis://localhost:6379/1"

由于 Celery 使用 rpush-blpop 来实现 FIFO 队列,我想知道对于不同的队列使用不同的 Redis 数据库是否正确甚至可能,例如 - q1 使用数据库 .../1 和 q2 使用数据库 .../2用于消息传递?这样每个工作人员将只听专门的数据库并从队列中提取任务,竞争较少。

  • 这有什么意义吗?
  • 如果是这样,您如何在 Celery 中实现类似的功能?

【问题讨论】:

  • 为什么选择 Redis 作为代理而不是 RabbitMQ?它应该处理的负载是多少?
  • 主要是简单。 Celery Redis 配置对我来说似乎非常简单,我就选择了它。

标签: python django redis celery worker


【解决方案1】:

首先,如果您担心负载,请指定您的预期数量/费率。

在我看来,您不应该担心 Redis 处理您的负载的能力。

  1. Redis 拥有自己的横向扩展/横向扩展功能,可在您需要时随时使用。
  2. 你可以使用 RabbitMQ 作为你的代理(使用rabbitMQ docker 也很简单,你可以看到example),它有自己的横向扩展能力来支持高负载,所以我不认为你应该担心这一点。

据我所知,没有办法为 Redis 代理使用不同的数据库。您可以使用不同的数据库创建不同的 Celery 应用程序,但是您不能设置任务之间的依赖关系(画布:组、链等)。我不会推荐这样的选择。

【讨论】:

    猜你喜欢
    • 2017-12-31
    • 2018-12-27
    • 2016-09-12
    • 2020-06-08
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    相关资源
    最近更新 更多