我想要设置一个包含多个工作人员的作业队列。现在我正在考虑beanstalkd,但这更像是一个概念问题,我相信:你怎样才能确保按顺序处理与单个实体相关的工作?
假设工作人员为某些UI管理电子邮件平台。对于给定的邮箱,需要连续执行作业。例如,有时用户需要在进行故障排除时将其密码重新推送到邮件平台。因此,他们更改密码,然后立即更改密码。这是提交给beanstalkd的两个密码更改工作。
现在,大部分时间这都会好起来,因为beanstalkd会将这些工作按顺序交给工人。但是,像DNS查找延迟这样的一些瞬态错误可能导致第二次密码更改(返回正确的密码)在第一次密码更改之前通过,使邮箱的密码不正确。
我考虑过引入semophores / mutexes,并且拥有1:1的worker-machine:beanstalkd-server比率,但即便如此,只有按照请求的顺序授予了锁请求,这似乎并不完全可靠。每个实体拥有一个队列会打开一些其他选项,但这需要支持数十万个实体。
根据我发现的关于这个主题的讨论很少,这不应该像我最初想的那样常见。有没有人有处理这个问题的经验?
答案 0 :(得分:1)
我想到了几种可能的方法。
根据用户数据存储的不同,您可能需要在数据库周围进行额外的锁定(使用SQL数据库,这非常简单,但基于文件的存储需要额外的锁定以避免潜在的文件损坏)。