如何处理工作中的竞争条件,例如: beanstalkd

时间:2015-08-04 17:47:20

标签: race-condition jobs beanstalkd delayed-execution

我想要设置一个包含多个工作人员的作业队列。现在我正在考虑beanstalkd,但这更像是一个概念问题,我相信:你怎样才能确保按顺序处理与单个实体相关的工作?

假设工作人员为某些UI管理电子邮件平台。对于给定的邮箱,需要连续执行作业。例如,有时用户需要在进行故障排除时将其密码重新推送到邮件平台。因此,他们更改密码,然后立即更改密码。这是提交给beanstalkd的两个密码更改工作。

现在,大部分时间这都会好起来,因为beanstalkd会将这些工作按顺序交给工人。但是,像DNS查找延迟这样的一些瞬态错误可能导致第二次密码更改(返回正确的密码)在第一次密码更改之前通过,使邮箱的密码不正确。

我考虑过引入semophores / mutexes,并且拥有1:1的worker-machine:beanstalkd-server比率,但即便如此,只有按照请求的顺序授予了锁请求,这似乎并不完全可靠。每个实体拥有一个队列会打开一些其他选项,但这需要支持数十万个实体。

根据我发现的关于这个主题的讨论很少,这不应该像我最初想的那样常见。有没有人有处理这个问题的经验?

1 个答案:

答案 0 :(得分:1)

我想到了几种可能的方法。

  1. 正如您所指出的,除非您更改优先级,否则Beanstalkd是FIFO队列。这意味着,如果只有一个工人正在处理更改密码,它将按顺序处理这些工作。
  2. 如果有多个工作人员,那么您可以将元数据与密码一起存储 - 最后修改时间(更准确地说,是在进行密码更改请求时)。该时间将从作业中设置,但如果数据库中已存在的时间(以及密码)比最新请求更新 - 则新请求将被删除为过期。
  3. 根据用户数据存储的不同,您可能需要在数据库周围进行额外的锁定(使用SQL数据库,这非常简单,但基于文件的存储需要额外的锁定以避免潜在的文件损坏)。

相关问题