等待时间后 Sidekiq 排队作业
Sidekiq enqueue job after a wait time
问题是处理对象的 sidekiq worker 在对象存在于数据库之前运行。作业正在对象模型中的 after_commit 回调中发送到队列。这是可能的,因为我有两个复制的数据库,一个用于读取,另一个用于插入。因此,进程从入队到失败的时间比数据在数据库中复制的时间要短。
解决问题的最佳方法是什么?本来想在enqueue和process之间加一些等待时间,保证数据在从库。 sidekiq 配置或类似配置是否可行?
你可以做几件事:
在 worker 中执行检查以确保对象存在;否则,重新排队作业。可能要考虑这一点,以确保您不会不小心永远重新排队坏工作,但这对您来说似乎是一个很好的健全性检查。
引入延迟。特别是,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 可能是一个更快的解决方案。
问题是处理对象的 sidekiq worker 在对象存在于数据库之前运行。作业正在对象模型中的 after_commit 回调中发送到队列。这是可能的,因为我有两个复制的数据库,一个用于读取,另一个用于插入。因此,进程从入队到失败的时间比数据在数据库中复制的时间要短。
解决问题的最佳方法是什么?本来想在enqueue和process之间加一些等待时间,保证数据在从库。 sidekiq 配置或类似配置是否可行?
你可以做几件事:
在 worker 中执行检查以确保对象存在;否则,重新排队作业。可能要考虑这一点,以确保您不会不小心永远重新排队坏工作,但这对您来说似乎是一个很好的健全性检查。
引入延迟。特别是,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 可能是一个更快的解决方案。