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)
备注
这个扩展有两个缺点:
- 它们使用YAML来序列化参数,因此,当传递一个复杂Ruby对象时,作业负载很容易变的非常大。
- 它们往 类 里添加方法
由于这些原因,它们是被默认关闭的。