两个工作人员应该不可能获得相同的“有效负载”,因为项目是使用BLPOP
. Redis 只会将排队的项目发送给第一个调用BLPOP
. 听起来您不止一次将作业排入队列,因此两个工作人员能够使用相同的参数获取不同的有效负载。'resque-lock-timeout' 的目的是确保具有相同方法和参数的有效负载不会同时运行;但是,如果第一个作业在第二个作业尝试获取锁之前释放锁,它不会阻止第二个有效负载的工作。
这只发生在短期运行的作业上是有道理的。以下是可能发生的情况:
payload 1 is enqueued
payload 2 is enqueued
payload 1 is locked
payload 1 is worked
payload 1 is unlocked
payload 2 is locked
payload 2 is worked
payload 2 is unlocked
在长时间运行的作业中,可能会发生以下情况:
payload 1 is enqueued
payload 2 is enqueued
payload 1 is locked
payload 1 is worked
payload 2 is fails to get lock
payload 1 is unlocked
尝试关闭 Resque 并将您的工作排入队列。查看 Resque 队列列表中的 redis(或使用 监视 Redis redis-cli monitor
)。查看 Resque 是否已将多个有效负载排队。如果您仍然只看到一个有效负载,则监视该列表以查看您的另一位 resque 工作人员是否正在调用recreate
失败的作业。
如果您想让“resque-lock-timeout”持有锁的时间超过处理作业所需的持续时间,您可以覆盖该release_lock!
方法以设置锁的到期时间,而不是仅仅删除它。
module Resque
module Plugins
module LockTimeout
def release_lock!(*args)
lock_redis.expire(redis_lock_key(*args), 60) # expire lock after 60 seconds
end
end
end
end
https://github.com/lantins/resque-lock-timeout/blob/master/lib/resque/plugins/lock_timeout.rb#l153-155