【问题标题】:Best approach to open and parse a file from an FTP (Rails, Sidekiq, SFTP)?从 FTP(Rails、Sidekiq、SFTP)打开和解析文件的最佳方法?
【发布时间】: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


【解决方案1】:

我通常会尝试将大型后台作业分解为它们的原子部分,这些部分最终会从主要的重复作业中分离出来。

在您的情况下,这看起来像这样:将您的 rake 任务移动到 Sidekiq 作业中,并使用 sidekiq-cron 之类的东西来安排它。该作业将负责遍历 FTP 服务器上的文件,下载它们,然后将作业排入队列以解析该文件(您将向作业传递文件的路径)。在该作业中,您将解析文件,保存需要保存的任何内容,并最终删除文件。

该架构利用您的各种 Sidekiq 工作人员,允许他们同时解析文件。此外,如果解析一个文件失败,它不会阻止解析其余文件。您可以依靠 Sidekiq 的内置重试逻辑来重试解析该文件,直到它成功(由于外部因素或错误修复)。您还可以完成更快的工作,每个工作都专注于一项非常具体的任务(“查找所有需要解析的文件”、“解析这个特定文件”)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 2010-09-06
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多