【问题标题】:Redis key not removed even after Resque job completes successfully即使 Resque 作业成功完成,Redis 密钥也未删除
【发布时间】:2014-11-21 08:38:57
【问题描述】:

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

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

作业成功运行到完成。但是key仍然存在于redis中。对于某个流程,我需要为相同的参数排队并再次执行作业(密钥基本上相同)。但似乎这项工作没有排队。

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

问题:

这种resque行为是否正常(成功完成后不移除key)?

如果是,我应该如何处理这种情况(根据最佳实践)?

如果不是,您能帮我了解发生了什么问题吗?

【问题讨论】:

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


    【解决方案1】:

    经过几个小时的调试,最后观察到的行为如下:

    • 我正在创建作业并使用 symbolized keys 传递选项(参数),当为同一作业创建 Redis 键时,键中带有符号化的参数。

    例子:

    Jobs::Abc::SomeJobCreator.create({:some_ids => [101]}) 将创建 "redis key""resque:lock:Jobs::Abc::SomeJobCreator.create({:some_ids => [101]})"(注意 key 是 key 中的符号)

    • 现在,当 after_perform_hook 执行时,它会尝试删除 Redis 密钥,但它会使用字符串化密钥搜索密钥:"resque:lock:Jobs::Abc::SomeJobCreator-({\"some_ids\"=>[101]}" 显然找不到,因为Redis 在 key 中有符号化的参数。

    • 要解决此问题,我必须更改代码中对作业创建的调用并使用如下字符串化参数:Jobs::Abc::SomeJobCreator.create({'some_ids' => [101]})。这很好用。

    不确定这是否与 Resque 的版本有关。由于它是一个旧代码库,我还没有更新版本。目前在 Resque v1.25.2

    【讨论】:

      猜你喜欢
      • 2016-03-18
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 2020-11-28
      • 1970-01-01
      相关资源
      最近更新 更多