ruby-on-rails - 等待时间后 Sidekiq 排队作业
问题描述
问题是处理对象的sidekiq worker在对象存在于数据库之前运行。该作业正在对象模型中的 after_commit 回调中发送到队列。这是可能的,因为我有两个复制的数据库,一个用于读取,另一个用于插入。因此,该过程从入队到失败的时间与数据在数据库中复制的时间相比是次要的。
解决方案的最佳方法是什么?我正在考虑在入队和进程之间添加一些等待时间,以确保数据在从数据库中。是否可以在 sidekiq 配置或类似的配置中?
解决方案
你可以做几件事:
在工作人员中实施检查以确保对象存在;否则,重新排队作业。可能想要考虑这一点,以确保您不会不小心将糟糕的工作重新排入队列,但这对您来说似乎是一个很好的健全性检查。
引入延迟。特别是,sidekiq 可以等待从队列中提取作业,直到指定时间。
“Sidekiq 允许您安排执行作业的时间。您使用 perform_in(interval, *args) 或 perform_at(timestamp, *args) 而不是标准的 perform_async(*args):
MyWorker.perform_in(3.hours, 'mike', 1) MyWorker.perform_at(3.hours.from_now, 'mike', 1)
"有关此选项的更多详细信息,请参阅https://github.com/mperham/sidekiq/wiki/Scheduled-Jobs。
就我个人而言,我会选择#1,但如果你绝望的话,#2 可能是一个更快的解决方案。
推荐阅读
- c# - 如何在 C# EF Core 中使用 join 子句中的条件编写 SQL 命令
- c - printf 语句末尾的空格被延迟打印或在 C 中用 Clion 修剪
- python - dask 分布式 - 使用从延迟函数返回的列表的正确方法
- javascript - 无法在反应中获得对象数组的预期映射结果
- c++ - Make在Boost中找不到.hpp文件
- r - 如何合并重复项
- java - 为什么 Eureka registry evict-task 运行如此缓慢?
- c# - 具有 jwt 令牌和 Azure AD 身份验证的 Blazor WASM 应用
- java - 在 Retrofit 中使用 Get 方法时获取 gson 时出错
- google-cloud-platform - 如何在大查询中在现有表上创建分区和集群?