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

Sidekiq Github wiki 中文文档

最佳实践

commit信息:clarify that the first example is a mistake | 提交者:jayqui-omada | 提交时间:2020-02-12 | 版本:6a24e4c

请遵守以下规则,以提高你的Sidekiq使用体验:

1.简化作业参数

Sidekiq 通过perform_async把参数转换为JSON然后传给Redis。有时人们很容易犯下面这种错误:

#MISTAKE
quote = Quote.find(quote_id)
SomeWorker.perform_async(quote)

复杂的Ruby对象不能转换为JSON,默认使用to_s转换,转换后看起来像 #<Quote:0x0000000006e57288>。即使它被正确的转换,如果排队备份它的同时这个引用对象又变化了该怎么办呢? 不要给Sidekiq传递状态,要传递简单的标识。查找那些在perform方法中真正需要的对象。

SomeWorker.perform_async(quote_id)

传递给perform_async的参数必须是普通的JSON数据类型:string, integer, float, bollean, null(nil), arrayhash。这意味着不能使用ruby symbols 作为参数。Sidekiq客户端API使用JSON.dump给Redis传递数据。Sidekiq服务从Redis获取JSON 数据,然后使用JSON.load 转换这些数据到Ruby类型最后传给方法。不要传递symbols,named parameters或者复杂的Ruby 对象(像Date或者 Time!), 因为这些数据不能正确地 转储/装载 。

2.确保你的作业是幂等的并且是事务性的

幂等性意味着你的作业可以安全的执行多次。例如,使用错误重试功能,你的任务可能被处理一半,抛出一个错误,然后一遍又一遍地再次执行直到它成功完成。比如你有一个作废信用卡事务的工作,然后给他们发邮件通知他们已经退还了收费。

def perform(card_charge_id)
  charge = CardCharge.find(card_charge_id)
  charge.void_transacation
  Emailer.charge_refunded(charge).deliver
end

当生成邮件时由于bug而失败会发生什么呢?当收费已经被退还时这个void_transaction方法支持这种情况吗?你可以使用数据库事务来保证当错误发生时数据改动能够回退,或者你可以自己写有适应力的代码来应对错误。一定记着Sidekiq*至少执行一次你的作业,但不仅仅执行一次*。

##3.拥抱并发

Sidekiq被设计为平行执行作业,根据这个特性来设计你的作业,这样你能同时平行运行很多作业。它有调整并发的基本功能(例如,在已定义线程数量的队列中targeting sidekiq进程),但是如果不需要这么专业化的设置,你的系统架构将非常简单。

如果你的Sidekiq进程拖垮了一个资源受限的服务器,你可以使用连接池来限制连接该服务的连接总数。

在作业中,Sidekiq不会提供缺乏并发性的功能。

下一篇: 使用Redis