即使在Resque作业成功完成后,Redis键也不会被删除

时间:2014-09-26 10:47:18

标签: ruby-on-rails cron redis resque jobs

这是我的方案,我使用resque在redis中排队作业,这是在ROR中完成的常用方式。我的密钥的格式看起来像这样(根据我的命名空间约定)

"resque:lock:Jobs::XYZ::SomeCreator-{:my_ids=>[101]}"

作业成功运行到completition。但关键仍然存在于redis中。对于某个流程,我需要为相同的参数重新排队并执行作业(密钥基本相同)。但似乎工作没有排队。

我的猜测是,由于密钥已经存在于Redis中,因此它不会再次对作业进行排队。

问题:

resque的这种行为是否正常(在完成completition后没有删除密钥)?

如果是,我应该如何处理这种情况(按照最佳做法)?

如果不是,你能帮我理解出了什么问题吗?

1 个答案:

答案 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