Безопасно ли передавать объекты в задание Resque? - PullRequest
7 голосов
/ 30 декабря 2011

Безопасно ли передавать объекты в задание Resque?Например:

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

Вместо:

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

Любой недостаток, если я передам объект (ы) в?

Ответы [ 4 ]

11 голосов
/ 30 декабря 2011

Страница Resque GitHub говорит (https://github.com/defunkt/resque)

... ваши задания должны принимать только аргументы, которые могут быть закодированы в JSON.

Кроме того, есть эффект, который вы должны принять во вниманиерассмотрение: переданный вами объект копируется. Допустим, это запись в базе данных. Если позже, когда задание будет выполнено, этот объект будет изменен в базе данных, задание не заметит, оно будет работать с собственной копией.В зависимости от ваших требований, это может быть желаемое поведение, а может и не быть.

Если вместо этого вы передаете id этого объекта, вы можете получить его последнюю версию в задании.

3 голосов
/ 24 октября 2012

я делаю Marshal.dump(object), а с другой стороны я делаю Marshal.restore(object) работает как заклинание, и это быстро ...

Например:

 @chart = chart_factory.build(chart_config)
   marshal_dump = Marshal.dump(@chart)
  Resque.enqueue(ChartsWorker, marshal_dump, url)
2 голосов
/ 30 декабря 2011

Основным недостатком, который я вижу, помимо передачи больших объектов, которые будут сериализованы по сравнению с идентификаторами, является то, что объекты, скорее всего, выйдут из синхронизации, поскольку очевидно, что задание может быть выполнено позже.

Вы обязательно должны использовать идентификаторы в большинстве случаев.

0 голосов
/ 12 января 2012

Передача завершенных объектов для восстановления может привести к большой нагрузке в Redis, а также к издержкам сериализации. Это не может быть проблемой для вас, но вы должны помнить об этом.

Лично я предпочитаю ставить идентификаторы в очередь.

...