我在rails / heroku中有一个长期运行的导入方法 我正在导入一个10兆的csv,需要一段时间..
当它正在运行时,我的同事会对不相关的视图进行更改并执行git.push。
我的导入被杀......
现在;我可以告诉他在我运行导入时不要做git.push。我们有一个客户端,所有导入都由开发团队完成。
未来我们将在全球拥有数十家客户。 我们无法控制何时选择进行导入。
所以我的问题是...... 其他人如何防范这类事情?如何确保正在运行的作业不会被删除,因为我想要更改某些内容?
答案 0 :(得分:3)
这里的问题是你的导入方法不健全。
Heroku在接受推动时会杀死你的dyno。如果Heroku使用太多内存,或者它已经存活了很长时间,或者它们正在重新平衡负载,或者如果你扩展该组中的进程数量,Heroku也可能会杀死你的dyno。此外,EC2实例可能因各种原因而死亡,包括电源,网络,存储和人为故障。
如果导入始终成功对您很重要,则需要适当地构建应用程序。暂时将要导入的数据放入S3,以防万一接收上传的dyno被杀死。在数据库中记录“需要导入此内容”。当您导入时,以事务方式导入,因此导入完全成功或完全失败。
那是很多工作吗?可能,也可能不是,取决于您选择的工具。 (Sidekiq通常会让我这么容易。)但是,这是你唯一真正的选择。
旧的思想是确保您的基础设施永不失败,从而导致具有多冗余光纤通道上行链路的SAN转向多冗余交换机转向多冗余存储阵列。这导致了热插拔CPU RAID for RAM和其他Enterprise Features™。但事实证明,即使你完成了所有这些,你的基础设施仍然会失败。
新的思想流派认识到失败是不可避免的。忘记所有那些花哨的东西:购买更大量的商品硬件,并构建你的应用程序以容忍失败。这是EC2模型,那就是Heroku模型。相应地设计。