将选项哈希传递给sidekiq worker

Bla*_*man 12 ruby-on-rails sidekiq

我记得当我尝试将params(JSON)选项传递给sidekiq worker方法时,它没有很好用,因为我引用了以下选项:

options[:email_address]
Run Code Online (Sandbox Code Playgroud)

但我认为如果我这样做会有效:

options["email_address"]
Run Code Online (Sandbox Code Playgroud)

因此,出于某种原因,当它被序列化和反序列化时,哈希只能用字符串而不是符号来引用.

这是安全的做法吗?

我有一个交易电子邮件工作者,看起来像:

class TransactionEmailWorker
    include Sidekiq::Worker

  def perform(action, options)
    case action
    when 'welcome'
      welcome(options["email_address"], options["something_else"])
    when 'reset_password'
      reset_password(options["email_address"])
    end
  end

  def welcome(email, title)
    # ...
  end

  def reset_password(email)
   # ..
  end
Run Code Online (Sandbox Code Playgroud)

小智 14

这就是Sidekiq 维基页面所说的内容:

传递给的参数perform_async必须由简单的JSON数据类型组成:string,integer,float,boolean,null,array和hash.Sidekiq客户端API用于JSON.dump将数据发送到Redis.Sidekiq服务器从Redis中提取JSON数据并用于JSON.load将数据转换回Ruby类型以传递给您的perform方法.不要传递符号,命名参数或复杂的Ruby对象(如Date或Time!),因为这些对象无法正确转储/加载往返.

传递Ruby哈希是有效的,因为它能够序列化为有效的JSON.所以回答你的问题,这是安全的做法.

serialized_args = JSON.dump({email_address: "someemailaddress@gmail.com", something_else: "thing"})
=> "{\"email_address\":\"someemailaddress@gmail.com\",\"something_else\":\"thing\"}"

JSON.load(serialized_args)
=> {"email_address"=>"someemailaddress@gmail.com", "something_else"=>"thing"}
Run Code Online (Sandbox Code Playgroud)


Mik*_*ham 8

作业参数必须是有效的JSON类型:

https://github.com/mperham/sidekiq/wiki/Best-Practices#1-make-your-job-parameters-small-and-simple

  • 使用哈希是不错的做法; 使用符号是. (6认同)
  • 使用 Sidekiq 是不好的做法!我在开玩笑,但这只是一个愚蠢的设计决策,您遵循 Ruby 约定,例如使用关键字参数,而 Sidekiq 默默地传递其他内容,尽管所有规范都通过(内联运行),但还是破坏了您的应用程序。我希望他们支持更好的序列化器,就像 Rails.cache 那样。 (5认同)