如何在多服务器环境中下载生成的.csv文件

时间:2011-03-05 03:27:06

标签: ruby-on-rails ruby

我有一个创建.csv文件的作业,并将它们保存在rails根目录中名为exports的目录中。我还有一个控制器可以下载这样的文件:

def download_export
  @export = Export.find(params[:id])

  export_file = "#{RAILS_ROOT}/exports/#{@export.name.gsub(/\s/,'_')}_#{@export.id}.csv"

  if File.exists?(export_file)
    options = {:filename => "Export (#{@export.name.gsub(/\s/,'_')}_#{@export.id}).csv", :type => "text/csv"}
    options = options.merge({:x_send_file => true}) if Rails.env != "development"
    send_file export_file, options
  else
    flash[:notice] = "<h3>Export data is not available.</h3>"
    redirect_to :action => "index"
  end
end

基本上,当在单个服务器上运行时,一切都按预期工作。生产环境已扩展到平衡器后面的两台服务器。有一个夜间任务,检查队列中是否有任何导出,如果是,则生成该文件。此任务始终仅在一个实例上运行。

我最好的选择是创建从其他服务器到保存文件的目录的符号链接吗?任何想法都将不胜感激。

2 个答案:

答案 0 :(得分:0)

如果生成csv导出的部分进程还使用其他服务器rsync该目录,该怎么办?如果其他服务器关闭,冗余可能会有益......

How to Synchronize Directories with Rsync

答案 1 :(得分:0)

在多个主机环境中,需要同步内容非常常见。为什么不考虑使用专为此目的而设计的rsync,还是rcpscp哪些不是那么聪明但同样能够移动文件?

您可以采用两种不同的方式:从源主机推送到辅助主机,或者让辅助主机获取数据。

就个人而言,我可能会选择第一种情况。设置一个cron作业,启动一个shell脚本,检查文件是否已准备好被推送。如果是这样,rsync(或scp / rcp)将结束,如果推送成功,则从源目录中删除它们。

在辅助主机上有一个cron作业,会定期触发,查找要导入的文件。如果没有文件立即退出。如果传入目录中有一些,请加载它们然后删除它们,然后退出。

链接到的rsync文章有几个可能有助于您入门的示例。