2017-06-13 60 views
1

我正在构建一个使用Rails的客户管理系统,该系统要求将包含客户信息的CSV文件导入到/与Postgres数据库进行比较。我在Heroku上托管应用程序。我使用Sidekiq将数据库移动到了背景,但需要建议将文件上传到导入的第一位。在S3上托管文件真的是最好的解决方案,还是没有使用第三方存储服务的简单解决方案?该应用程序将每天使用,但最多有10名员工,上传的大型CSV文件约为100,000行。使用Rails,Postgres和Sidekiq导入CSV

谢谢。

回答

1

是的,我认为S3是最好的解决办法

我们在Storemapper面临着同样的问题(我们使用Resque代替Sidekiq,但是这不是一个问题)。这里的限制因素是Heroku请求超时。你只有30秒才能完成你的上传到Heroku,这会严重限制你的csv的大小。这是S3来的地方。基本上我们所做的是:

  1. 用户通过javascript直接上传csv到S3,绕过我们在Heroku上的应用服务器。

  2. 一旦上传完成后,JavaScript却使到应用服务器的请求将推出后台工作,告诉工人所在的文件是在S3

  3. 工人下载从S3的CSV,然后将其处理为必要

我发现carrierwave_direct宝石成为步骤1和2对于步骤3非常有益的,我使用smarter_csv宝石。在这里结帐我们的完整故事: https://tylertringas.com/very-large-csv-import-in-rails-on-heroku/

+1

非常感谢@ taufiq-muhammadi的回应。我实际上已经在使用你和泰勒的故事了!这是我错过了Javascript服务器旁路部分。我找到了一个[Heroku sourced explain](https://devcenter.heroku.com/articles/direct-to-s3-image-uploads-in-rails),它非常有用,并使用JqueryFileUpload而不是carrierwave_direct。作为奖励,它概述了一个很好的CSS进度条,以及文件上传。再次感谢! – crmmmc

+0

不错!我不知道JQueryFileUpload。很高兴它成功了! –

+0

嘿@Taufiq,你能回答我的问题吗?在Storemapper的故事中,Tyler提到“从s3获取文件并处理它。”我使用AWS/S3 API来访问文件,但是我应该直接从S3访问它,还是将它保存在我的数据库或应用程序中的某个位置,然后进行处理?就像现在一样,我的工作人员正在从S3直接处理它,并且由于较大的文件而失败。 – crmmmc