在 Celery 中为不同的队列使用不同的 Redis 数据库

Using Different Redis Database for Different Queues in Celery

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

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

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

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

首先,如果您担心负载,请说明您的预期numbers/rates。

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

  1. Redis 有自己的扩展/扩展功能,只要您需要它们。
  2. 您可以使用 RabbitMQ 作为您的代理(使用 rabbitMQ docker is dead-simple as well, you can see ),它同样具有支持高负载的横向扩展功能,因此我认为您不必担心这一点。

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