Практическое использование отложенной фоновой работы при работе со многими пользователями - PullRequest
2 голосов
/ 02 мая 2011

Когда запускается фоновое задание, оно отправляется в конец очереди, где его обрабатывает работник; задача очищается, а другая запускается. Я думаю, что я понял это правильно, за исключением того, что я не понимаю практическую сторону этого в некоторых случаях. Несомненно, если вы компания, рассылающая 15 000 информационных бюллетеней раз в неделю с использованием отложенной работы, это имеет смысл. Но если у вас есть приложение из даже 100 пользователей, в котором какое-то задание достаточно длинное, чтобы требовать фоновой работы (например, отправка / получение писем, которое может занять минуту), тогда каждому пользователю придется ждать в очереди, пока другой пользователь очищается (в если есть один рабочий).

Это та часть, в которой я не уверен, что понял правильно. Я говорю о том же задании , но индивидуально для каждого пользователя. Это считается работой на пользователя? Если у меня 100 пользователей, нужно ли сохранять 100 рабочих для каждого процесса, чтобы не связываться?

Я пытался использовать delayed_job , чтобы смоделировать это, и действительно, когда я вхожу с другой учетной записью, мне приходится ждать, пока письмо другого пользователя не будет отправлено, пока не появится мое. В то время как плагин работает быстро и просто, я думаю, что это неправильный подход.

Я также пытался использовать Ajax, но, поскольку это HTTP-запрос, он связывает браузер в режиме загрузки, пока не получит ответ от сервера (даже с async: true). Не уверен, что я исключил это слишком быстро, но я искал более элегантное серверное решение.

Есть ли способ добиться такой фоновой работы? (Я слышал о различных, в основном коммерческих решениях, обещающих мало времени ожидания, но я заинтересован в полном устранении очереди между пользователями). Если нет, есть ли способ сделать ajax-запрос, не ожидая ответа? Я понимаю, что мои вопросы кардинально отличаются, но оба кажутся подходящим решением этой проблемы.

Ответы [ 2 ]

0 голосов
/ 02 мая 2011

Resque - это механизм фоновой обработки, который может поддерживать несколько очередей.

Способы, которыми вы можете использовать это:

  1. Сгруппируйте свои задачи в очереди, которые имеют смысл по приоритету. Если вам нужно быстрое время отклика, используйте его в очереди «переднего плана». Медленный? (например, отправка / получение писем) может находиться в очереди «в фоновом режиме»
  2. Иметь одну очередь на пользователя (для этого вам понадобится много рабочих)

Этот вопрос SO также дает возможность использовать delayed_jobs с несколькими очередями / таблицами

0 голосов
/ 02 мая 2011

Цель delayed_job и других очередей сообщений - асинхронная обработка заданий вне вашего основного приложения.Я всегда использую очередь для отправки электронной почты, поскольку полагаюсь на стороннее приложение (иногда стороннее API, такое как gmail), и не могу гарантировать доступность и эффективность работы.

Так что для вашегоВ случае использования, даже с очень небольшим количеством пользователей, я настоятельно рекомендую разгрузить электронные письма на delayed_jobЭто ускорит ваш интерфейс (AJAX), а также даст вам повторные попытки в случае неудачи.Вы можете набрать несколько рабочих для обработки очереди, но с вашими номерами это может не понадобиться, если ваши звонки для отправки почты занимают очень много времени (более пары секунд?).

И дав большинстве ситуаций я бы создавал отдельные задания для каждого пользователя, даже если сообщение может быть идентичным.Единственный раз, когда я обработаю их все вместе, будет, если приложение электронной почты / API имеет массовую отправку, и вы можете значительно сократить количество вызовов, отправив большую полезную нагрузку за несколько вызовов.

...