У нас есть общий FTP с нашим деловым партнером. Партнер отправляет туда текстовые файлы, содержащие информацию о заказах.
Со своей стороны, мы каждый час (CRON) запускаем задачу rake, которая подключается к FTP (мы используем SFTP ), затем в цикле перечисляем все файлы, открываем один после другой, извлеките необходимую информацию оттуда и сохраните ее в нашей базе данных. Затем мы удаляем файл с FTP.
Для среднего файла эта операция длится около 20 с. Если я представлю, что нам нужно обработать 20 файлов, это почти 7 минут, и я беспокоюсь, что приложение зависнет.
Вот псевдокод, который мы используем:
namespace :check_ftp do desc "Check every 30 minutes"
task :fetch_orders => [:environment] do
check_dir = '/dir'
Net::SFTP.start(host, username, password: pass) do |sftp|
sftp.dir.entries(check_dir).each do |remote_file|
file_data = sftp.download!(file_path) # loading the file to the buffer
... here goes all the parsing ...
... here save to the DB ...
... log information about this action ...
... delete the file from FTP ...
end
end
end
end
Каков наилучший подход для обработки всех файлов с FTP с минимальными сбоями (в идеале, без ошибок), если задача rake будет выполняться ~ 20 минут?
Я думал, что смогу запустить весь блок Net::SFTP.start(...
с Sidekiq. Тогда я также думал, что буду выполнять только эти действия
... here goes all the parsing ...
... here save to the DB ...
... log information about this action ...
... delete the file from FTP ...
в задании Sidekiq (не весь блок Net::SFTP.start...
).
Каков наилучший подход для разрешения этой ситуации?
Заранее спасибо.