0

rails/heroku で長時間実行されている import メソッドがあります。
10 メガの csv をインポートしていますが、しばらく時間がかかります..

それが実行されている間、私の同僚は無関係なビューに変更を加え、git.push を実行します。

私のインポートは殺されます...

たった今; インポートの実行中に git.push を実行しないように彼に伝えることができます。1 つのクライアントがあり、すべてのインポートは開発チームによって行われます。

将来的には、世界中に数十のクライアントを持つことになります。彼らがインポートをいつ行うかを制御することはできません。

だから私の質問はこれです... 他の人はこのようなことからどのように保護しますか? 何かを変更したいために実行中のジョブがダウンしないようにするにはどうすればよいですか?

4

1 に答える 1

3

ここでの問題は、インポート方法が堅牢ではないことです。

プッシュを受信すると、Heroku は dyno を強制終了します。Heroku は、dyno が大量のメモリを使用している場合、長期間稼働している場合、負荷を再調整している場合、またはそのグループ内のプロセス数をスケーリングしている場合にも、dyno を強制終了する可能性があります。さらに、その EC2 インスタンスは、電力、ネットワーク、ストレージ、人的障害など、さまざまな理由で起動したり停止したりする可能性があります。

インポートが常に成功することが重要な場合は、アプリケーションを適切にビルドする必要があります。アップロードを受信した dyno が強制終了された場合に備えて、インポートするデータを一時的に S3 に置きます。「これはインポートする必要がある」という記録をデータベースに入れます。インポートするときは、トランザクションごとにインポートして、インポートが完全に成功するか完全に失敗するようにします。

それは大変な作業ですか?ツールの選択に応じて、そうでない場合もあります。(通常、 Sidekiqを使用すると、これを簡単に行うことができます。)ただし、これが唯一の現実的なオプションです。

従来の考え方は、インフラストラクチャに障害が発生しないようにすることでした。その結果、多重冗長ファイバー チャネル アップリンクを備えた SAN が多重冗長スイッチに接続され、多重冗長ストレージ アレイに接続されました。これにより、CPU のホットスワップ、RAM の RAID、およびその他の Enterprise Features™ が実現しました。しかし、それをすべて行ったとしても、インフラストラクチャは依然として機能しません。

新しい考え方は、失敗は避けられないことを認識しています。派手なことはすべて忘れてください。市販のハードウェアを大量に購入し、障害に耐えられるようにアプリケーションを構築してください。それが EC2 モデルで、それが Heroku モデルです。それに応じて設計します。

于 2012-10-05T00:30:54.047 に答える