这是我的方案,我使用resque在redis中排队作业,这是在ROR中完成的常用方式。我的密钥的格式看起来像这样(根据我的命名空间约定)
"resque:lock:Jobs::XYZ::SomeCreator-{:my_ids=>[101]}"
作业成功运行到completition。但关键仍然存在于redis中。对于某个流程,我需要为相同的参数重新排队并执行作业(密钥基本相同)。但似乎工作没有排队。
我的猜测是,由于密钥已经存在于Redis中,因此它不会再次对作业进行排队。
问题:
resque的这种行为是否正常(在完成completition后没有删除密钥)?
如果是,我应该如何处理这种情况(按照最佳做法)?
如果不是,你能帮我理解出了什么问题吗?
答案 0 :(得分:0)
经过几个小时的调试,最后这是观察到的行为:
symbolized keys
传递选项(参数),当使用键中的符号化参数为同一作业创建Redis键时。示例:
Jobs::Abc::SomeJobCreator.create({:some_ids => [101]})
会将“redis key”创建为"resque:lock:Jobs::Abc::SomeJobCreator.create({:some_ids => [101]})"
(注意密钥是密钥中的符号)
现在,当 after_perform_hook 执行时,它会尝试删除Redis密钥,但会使用字符串键搜索密钥:"resque:lock:Jobs::Abc::SomeJobCreator-({\"some_ids\"=>[101]}"
显然无法找到,因为Redis中的键在键中表示了params。
要解决此问题,我必须在代码中更改对作业创建的调用,并使用如下字符串化的参数:Jobs::Abc::SomeJobCreator.create({'some_ids' => [101]})
。这很好。
不确定这是否与Resque版本有关。由于它的旧代码库我还没有更新版本。它目前在 Resque v1.25.2