将对象传递给Resque作业是否安全?例如:
Resque.enqueue(Foobar, @foo, @bar)
而不是:
Resque.enqueue(Foobar, @foo.id, @bar.id)
如果我在#?p>中传递对象,会有什么不利之处
答案 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加入队列。