Лучший подход, чтобы открыть и разобрать файл с FTP (Rails, Sidekiq, SFTP)? - PullRequest
0 голосов
/ 14 мая 2018

У нас есть общий 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...).

Каков наилучший подход для разрешения этой ситуации?

Заранее спасибо.

1 Ответ

0 голосов
/ 14 мая 2018

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

В вашем случае это выглядело бы следующим образом: переместите задачу rake в задание Sidekiq и назначьте для нее что-то вроде sidekiq-cron . Это задание будет отвечать за перебор файлов на FTP-сервере, их загрузку, а затем ставить в очередь задание для анализа этого файла (вы передадите задание пути к файлу). В этом задании вы проанализируете файл, сохраните все, что нужно сохранить, и в конечном итоге удалите файл.

Эта архитектура использует преимущества ваших различных работников Sidekiq, позволяя им одновременно анализировать файлы. Кроме того, если анализ одного файла завершится неудачно, это не помешает анализу остальных файлов. Вы можете положиться на встроенную логику повторных попыток Sidekiq для повторного анализа этого файла до тех пор, пока он не будет выполнен успешно (из-за внешних факторов или исправления ошибки). Вы также получите более быстрые задания, каждое из которых сфокусировано на очень конкретной задаче («Найти все файлы, которые нужно проанализировать», «Разобрать этот конкретный файл»).

...