2013-11-25 2 views
1

Я пытаюсь разбить загрузку файла в фоновом режиме. Мои активы хранятся на S3.Разрыв файла Загрузка в фоновый процесс с помощью Sidekiq

Мой оригинальный (блокировка) код выглядит следующим образом

# From DownloadsController#download 

data = open(path) 
send_data(data.read, type: @download.mime_type, filename: @download.file_title) 

Так я настроил Redis и Sidekiq, и создал FielDownloadWorker:

class FileDownloadWorker 

    include Sidekiq::Worker 

    def perform(path, mime_type, file_title) 
    data = open(path) 
    # What happens next? 
    end 

end 

Который вызывается с помощью:

FileDownloadWorker.perform_async (путь, @ download.mime_type, @ download.file_title)

Как начать загрузку с рабочего?

ответ

0

Я закончил тем, инициируя файл загружается непосредственно с S3, используя Query String Authentication. Таким образом, файл загружается непосредственно клиенту с S3, а поток приложений Rails не блокируется.

Отличная запись here.

4

Вы не можете. Вы хотите, чтобы пользователь получил файл, не так ли? Это должно произойти в контроллере, чтобы контроллер мог ответить с загрузкой. Если вы пытаетесь достичь параллельности попробуйте использовать темы:

@data = nil 
t = Thread.new { @data = open(path) } 
# ... do other stuff ... 
t.join # wait for download to finish in other thread 
send_data(@data.read, type: @download.mime_type, filename: @download.file_title) 

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

  1. Пользователь нажимает кнопку, чтобы начать загрузку.
  2. обновления страницы с сообщением «Ваш файл загружается, обновите страницу через несколько секунд»
  3. пользователь обновляет страницу, ваш контроллер видит, что файл будет загружен и делает send_data
+0

Спасибо, что ответили. Я пытаюсь сделать нестандартный подход? Должен ли я беспокоиться о блокировке при загрузке? – Undistraction

+1

Довольно стандартно отложить блокировку операций ввода-вывода для рабочего. Но не стандарт, чтобы рабочий отвечал на пользователя с загрузкой. Рабочие не могут выдавать ответы. Только контроллеры. Некоторые способы решения этой проблемы связаны с вышеупомянутыми решениями. – DiegoSalazar

Смежные вопросы