使用Celery动态创建队列

时间:2011-10-26 10:36:28

标签: message-queue rabbitmq celery

我正在使用Django,Celery和RabbitMQ编写邮件列表管理器。当收到消息时,将为每个收件人执行一项任务。所有任务都转到一个队列,一个或多个工作人员从队列中消耗任务,构建电子邮件消息并发送它们。

单个队列导致公平问题:如果邮件进入大型邮件列表,则会向队列中添加大量任务,而其他邮件无法通过其他较小的邮件列表,直到所有邮件发送到已发送大型列表。我怎样才能找到解决方法呢?

从概念上讲,解决方案是为每个邮件列表创建一个队列,让工作人员从各种队列循环中消耗任务。这是否可以在Celery中使用,因为我需要能够动态创建新的邮件列表?我没有看到动态创建队列或让工作人员从新队列中消耗的功能。

1 个答案:

答案 0 :(得分:3)

如下图所示,考虑使用主题交换而不是直接交换的系统。

与直接交换不同,主题交换允许我们将不同的消息路由到不同的队列。这是通过为每条消息设置routing_key并将某些队列绑定为仅接受具有特定路由密钥的消息来完成的。

系统可以设置为高优先级转到专用队列和消费者,类似的正常或低优先级消息由一个或多个队列处理。

Celery支持跨多个工作人员的负载平衡(工作人员数量取决于硬件)。像BROKER_POOL_LIMIT,PREFETCH_LIMIT等Celery配置设置有助于更好地实现负载平衡并减少拥塞。

enter image description here