【发布时间】:2012-10-15 02:28:28
【问题描述】:
我的基础架构中有一个 Resque 服务器“集群”。它们都具有完全相同的作业优先级等。我会根据有多少待处理的作业以及服务器上用于处理所述作业的可用资源来自动上下缩放 Resque 服务器的数量。我总是至少有两个 Resque 服务器。
我的问题是,当我完成一项快速的、一次性的工作时,有时两个服务器都会处理该工作。这很糟糕。
我尝试使用以下内容为我的工作添加锁:
require 'resque-lock-timeout'
class ExampleJob
extend Resque::Plugins::LockTimeout
def self.perform
# some code
end
end
此插件适用于运行时间较长的作业。然而,对于这些超小的一次性工作,处理会立即发生。 Resque 服务器都看不到其姊妹服务器设置的锁,都设置了锁,处理作业,解锁,然后完成。
除了让一台专用服务器处理此类工作外,我不完全确定此时该做什么或有什么解决方案。配置和扩展这将是一个严重的痛苦。我真的希望两台服务器都能处理它,但是一旦其中一台从队列中抓取它,请确保另一台不会运行它。
谁能提出一些可行的解决方案?
【问题讨论】:
-
aahh 你的意思是你有两个 resque 的工作,而且他们都碰巧开始从事同一个工作,这很奇怪,因为我知道 resque 在内部使用
pop在旧的resque和BRPOPLPUSH在新的 resque 中,如果没有错,我猜上述任何一个命令的并发访问都将保证结果为 one 和nil,如果列表为空,因此您提到的情况不太可能。如果我错了,请纠正我 -
我不知道你在哪里。我了解 Resque 为处理工作所做的工作。但是,这些作业最终仍会同时得到处理。这就是为什么要建造诸如锁定宝石之类的东西的原因。不过,我没有运气。
-
我不知道该告诉你什么我编造的观点是
redis is single thread和LOPOP和BLPOPresque 用来为队列消费消息的两个命令都是原子的这保证只有一个成功,你所说的永远不会发生我不确定lockinggem 应该做什么,但你认为不成立,不要误会我的意思。可能是你的代码预览可以帮助纠正如果我错了 -
更好地解释上下文是什么!您是多次排队同一工作还是您的意思是许多工人在做同一工作(仅排队一次)?
-
@randombits 你用的是什么版本的 Redis 和 resque?
标签: ruby-on-rails ruby redis resque