【发布时间】:2018-05-14 12:58:53
【问题描述】:
我们与业务合作伙伴共享 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
如果 rake 任务将运行约 20 分钟,那么处理 FTP 中所有文件的最佳方法是什么?
我在想我会用 Sidekiq 运行整个 Net::SFTP.start(... 块。然后,我也在想我只会运行这些动作
... here goes all the parsing ...
... here save to the DB ...
... log information about this action ...
... delete the file from FTP ...
在 Sidekiq 工作中(不是整个 Net::SFTP.start... 块)。
解决这种情况的最佳方法是什么?
提前谢谢你。
【问题讨论】:
-
我首先要说的是,首先你必须说出这些部分中的哪一个是耗时的:-...这里是所有的解析...-...这里保存到DB ... - ...有关此操作的日志信息... - ...从FTP中删除文件...因为将东西包装在sidekiq worker中,有点止痛,但仍然是您遇到的实际问题将留在那里。
标签: ruby-on-rails ruby sftp sidekiq