将对象传递给Resque作业是否安全?

时间:2011-12-30 15:33:34

标签: ruby-on-rails-3 backgroundworker resque

将对象传递给Resque作业是否安全?例如:

Resque.enqueue(Foobar, @foo, @bar)

而不是:

Resque.enqueue(Foobar, @foo.id, @bar.id)

如果我在#?p>中传递对象,会有什么不利之处

4 个答案:

答案 0 :(得分:11)

Resque github页面说(https://github.com/defunkt/resque)

  

...您的作业必须只接受可以进行JSON编码的参数。

此外,您应该考虑以下因素:您传递的对象会被复制。比方说,它是数据库中的记录。如果以后,当作业执行时,该对象在数据库中被更改,作业将不会被注意到,它将在自己的副本上运行。根据您的要求,这可能是期望的行为,或者可能不是。

如果您传递了id该对象,则可以在作业中检索它的最新版本。

答案 1 :(得分:3)

我正在做的是Marshal.dump(object)而在另一方面,我做Marshal.restore(object)的工作就像一个魅力,它很快......

例如:

 @chart = chart_factory.build(chart_config)
   marshal_dump = Marshal.dump(@chart)
  Resque.enqueue(ChartsWorker, marshal_dump, url)

答案 2 :(得分:2)

除了传递与ids相比序列化的大对象之外,我可以看到的主要缺点是对象很可能会失去同步,因为显然,作业可以在以后执行。

在大多数情况下,您绝对应该使用ID。

答案 3 :(得分:0)

将完整对象传递给resque可能会导致Redis负载过重以及序列化开销。这对您来说可能不是问题,但您必须牢记这一点。

我个人更喜欢将ID加入队列。