Как могут наблюдатели Rails и обратные вызовы обрабатываться асинхронно (в другом потоке)? - PullRequest
6 голосов
/ 22 февраля 2011

Наблюдатели и обратные вызовы в моделях Rails работают в одном потоке и блокируют запрос до тех пор, пока не вернутся.

Например, если у меня есть модель Photo и я ставлю задание на изменение размера в обратном вызове after_create или в наблюдателе, запрос не завершится, пока не будет сделана запись в очереди (что иногда может быть медленным, если яя использую Amazon SQS для очередей).

То же самое относится и к обратным вызовам на контроллерах Rails.Если мне нужно запустить обслуживание, такое как управление кэшем или аналитику магазина, запрос не завершится, пока не завершится обратный вызов.

Существует ли способ Rails для запуска кода внутри обратного вызова (модель или контроллер) или наблюдателя вдругой поток, так что запрос не остановлен?

1 Ответ

2 голосов
/ 22 февраля 2011

Пара популярных способов запуска кода в фоновом режиме из цикла запрос / ответ: delayed_job и resque

delayed_job использует вашу базу данных для постановки в очередь заданий фоновой обработки, а для восстановления использует Redis.

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

Это не делает ваши обозреватели и обратные вызовы автоматически выполняющимися в фоновом режиме, но делает это довольно легко, и многое другое. Эта техника очень широко распространена и испытана в сообществе Rails.

...