浩文 联系 关于本站 登录 注册
  • 关注新浪微博:
  • 关注微信公众号:

Sidekiq Github wiki 中文文档

延时扩展

commit信息:Updated Delayed extensions (markdown) | 提交者:mperham | 提交时间:2019-09-03 | 版本:c03d6d9

延后扩展提供了非常简单的方法来使方法调用变为异步调用。默认,所有的类方法和ActionMailer deliveries可以被它异步调用。

它们在Sidekiq 5以上被默认关闭。使用Sidekiq::Extensions.enable_delay!来开启它们。

ActionMailer

使用delay来异步发送你的邮件。使用delay_for(interval)  或者delay_until(time)在未来的某时发送邮件。

UserMailer.delay.welcome_email(@user.id)
UserMailer.delay_for(5.days).find_more_friends_email(@user.id)
UserMailer.delay_until(5.days.from_now).find_more_friends_email(@user.id)

推荐避免给mailer方法传递对象实例。 相反,传递对象id然后在mailer 方法中重新实例化,依照 [[最佳实践]]。

ActiveRecord

为了异步执行你的任何ActiveRecord方法请使用delay, delay_for(interval)或者delay_until(time)

User.delay.delete_old_users('some', 'params')
User.delay_for(2.weeks).whatever
User.delay_until(2.weeks.from_now).whatever

我强烈推荐避免传递实例到延迟方法。 这会把对象状态存储在Redis中,那些状态通常会过时,从而造成陈旧的数据。

Class Methods

使用以上相同的方法,任何类方法都可以被延时:

MyClass.delay.some_method(1, 'bob', true)

记着保持方法参数简洁,不要传递复杂的Ruby对象。

Advanced Options

通过传递一些选项给.delay调用,你可以调整使用的选项:

MyClass.delay(retry: false).some_method(1, 2, 3)
MyClass.delay(queue: 'low').some_method(1, 2, 3)
MyClass.delay_for(10.minutes, retry: false).some_method(1, 2, 3)

备注

这个扩展有两个缺点:

由于这些原因,它们是被默认关闭的。

上一篇: 计划作业 下一篇: 部署