任务队列池的概念方法

时间:2014-05-20 06:40:15

标签: celery message-queue distributed atomicity

假设我有一个用于处理电子邮件的分布式任务队列。需要获取和解析的每封电子邮件都会在队列中创建一个新作业。

现在,电子邮件提供商的速率限制为每个电子邮件帐户的n个并发连接数,因此当我的工作人员启动任务时,它将获得“连接”(通过连接我只是想要考虑到这样一个事实:现在n-1个可用的连接,供其他工作人员访问该帐户)。如果没有空闲连接,工作人员会将工作返回给经纪人并继续尝试下一份工作。

我试图用原子锁来解决这个问题,工人首先必须获得锁才能进入连接池,但遇到了一个雷鸣般的群体问题 - 工人有时会碰到它,正好有两个工人可以获得锁同时丢掉计数并超过限额。

这种情况有更优雅的方法吗?

1 个答案:

答案 0 :(得分:0)

基本上有两种方法可以解决这个问题:

  1. 您有1项服务可以处理锁定计数。这样你就可以在程序代码中锁定原子锁本身的访问权限,并确保不会超过锁的最大数量。
  2. 如果你想要一种分散的方式来放弃连接,而没有一位当选的领导者,我知道这样做的另一种方式就是Paxos algorithm