0

我在 rails/heroku 中有一个长期运行的导入方法。
我正在导入一个 10 兆的 csv,这需要一段时间..

当它运行时,我的一个同事更改了一个不相关的视图并执行了 git.push。

我的进口被杀了......

马上; 我可以告诉他在我运行导入时不要执行 git.push。我们有一个客户,所有的导入都是由开发团队完成的。

未来我们将在全球拥有数十个客户。我们无法控制他们何时选择进行导入。

所以我的问题是......其他人如何防止这样的事情发生?我如何确保正在运行的作业不会因为我想更改某些内容而被关闭?

4

1 回答 1

3

这里的问题是您的导入方法不可靠。

Heroku 在收到推送时会杀死您的测功机。如果 Heroku 使用太多内存,或者如果它已经存在很长时间,或者如果他们正在重新平衡负载,或者如果您扩展该组中的进程数量,Heroku 也可能会杀死您的测功机。此外,该 EC2 实例可能会因各种原因而启动和死亡,包括电源、网络、存储和人为故障。

如果导入总是成功对您很重要,那么您需要适当地构建您的应用程序。将要导入的数据暂时放在 S3 中,以防收到上传的 dyno 被杀死。在您的数据库中输入一条记录,说明“这个东西需要导入”。导入时,以事务方式导入,因此导入完全成功或完全失败。

工作量很大吗?也许,也许不是,取决于您选择的工具。( Sidekiq通常对我来说很容易。)但是,这是您唯一真正的选择。

旧的思想是确保您的基础设施永远不会出现故障,从而导致具有多重冗余光纤通道上行链路的 SAN 到多重冗余交换机再到多重冗余存储阵列。这导致了热插拔 CPU、用于 RAM 的 RAID和其他 Enterprise Features™。但事实证明,即使你完成了所有这些,你的基础设施仍然失败。

新学派认识到失败是不可避免的。忘记所有花哨的东西:大量购买商品硬件,并构建您的应用程序以容忍故障。这就是 EC2 模型,这就是 Heroku 模型。相应地设计。

于 2012-10-05T00:30:54.047 回答