Rails - запуск потоков после выхода из метода - PullRequest
0 голосов
/ 23 октября 2018

Когда клиент меняет свое изображение профиля, он обращается к методу update, который отвечает update.js.erb.Это быстрый и простой процесс.Однако за кулисами на сервере из изображения профиля создается группа файлов (10 из них), которые необходимо загрузить в сервер Amazon с сервера.Это длительный процесс, и я не хочу заставлять клиента ждать, пока он не закончится.Более того, загрузка файлов часто завершается неудачей с RequestTimeoutException, поскольку они занимают более 15 секунд.

Все это вызывает много вопросов:

Как вы выполняете генерацию / загрузку 10 файлов послеupdate метод вышел?Потоки уничтожаются после завершения метода main.

Как перехватить исключение внутри потока?Следующий код не перехватывает исключения тайм-аута.

threads = []

threads << Thread.new {
  begin
    # upload file 1 ....
  rescue Rack::Timeout::RequestTimeoutException => e
    # try to upload again ....
  else
  ensure
  end
}

threads << Thread.new {
  begin
    # upload file 2 ....
  rescue Rack::Timeout::RequestTimeoutException => e
    # try to upload again ....
  else
  ensure
  end
}

threads.each { |thr|
  thr.join
}

Каков наилучший способ снова загрузить файл, если он истек?

Как лучше всего решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

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

0 голосов
/ 23 октября 2018

Я также столкнулся с той же проблемой в проекте.Я нашел решение, использующее AWS lambda.Вы можете использовать модуль активного хранения carrierwave gem / rails 5, если вы используете rails для загрузки изображения на S3.Если вы не используете rails, используйте AWS-SDK для ruby ​​для загрузки файлов на S3.Вы можете связывать события всякий раз, когда файл создается / изменяется на S3.Каждый раз, когда файл создается, он вызывает лямбда-функцию, и ваша работа завершена.может связать их с лямбда-функцией.В лямбда-функции вы можете написать логику для создания файлов и загрузить его обратно в s3.Вы можете написать лямбда-код в ruby, node и python.

Эта стратегия может вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...