12

シナリオは単純です: EF コードの最初の移行を使用し、複数の Azure Web サイト インスタンス、100 GB のようなまともなサイズの DB (Azure SQL を想定)、多くのアクティブな同時ユーザー..20k と言う。

目標: アクティブなユーザーに更新をプッシュし、アップグレード中に整合性を維持します。

見つけたすべてのドキュメントをふるいにかけました。ただし、コアの詳細が欠落しているように見えるか、あからさまに見落としています。Azure が FTP/git/tfs 経由で更新要求を受信した場合、更新はどのように処理されますか? アクティブなユーザーに対して何をしますか? たとえば、すべてのインスタンスへの着信要求を凍結し、既に処理されているアイテムを終了させ、各インスタンスをアップグレード/交換し、EF 移行を処理させてから、トラフィックを再開しますか? すべてのインスタンスを同時にアップグレード/更新する場合、EF 移行が 1 回だけ実行されるようにするにはどうすればよいですか? ローリング アップグレード プロセス (インバウンド トラフィックのフリーズなしで一度に 1 つずつアップグレード) でインスタンスをライブで更新する場合、古い状態のインスタンスが破損する可能性があるため、どのように整合性を確保できますか?

主な質問は、更新のリクエストを受け取った後の実際のプロセスは何ですか? ライブ Web サイトを更新するための推奨事項は何ですか?

4

3 に答える 3

2

簡単に言えば、そうではありません。

EF の移行と Azure のデプロイは、まったく異なる 2 つの獣です。Azure のデプロイでは、更新スロットやステージング スロットなど、さまざまなオプションが提供されます。おそらく
Azure App Serviceに Web アプリをデプロイする を見たことがあるでしょう。他の読者にとっては、これが良い出発点です。

一般に、Azure デプロイ モデルは、IIS/Web サイト スタックへのアクティブな接続に関心があります。一般に、更新では、デプロイされているインスタンスをロード バランサー プールから取り出し、トラフィックを他のインスタンスにリダイレクトすることで、ユーザー アクセスが中断されないようにします。次に、インスタンスを 1 つずつ更新します。

これは、更新プログラムの展開中、常に複数のバージョンのコードが同時に実行されることを意味します。

EF モデルがコード バージョン間で変更されていない場合、Azure のデプロイは魔法のように機能し、ユーザーはそれが起こっていることさえ知りません。ただし、移行の一部として移行を適用する必要がある場合は注意してください

一般に、EF は、コードと DB のバージョンが一致する場合にのみモデルを読み込みます。EF 移行を使用して、モデルの複数のコード バージョンを同時にサポートするのは非常に困難です。

EF 移行は、データベース初期化子によって主に制御されます。詳細については、移行を使用してデータベースをアップグレードするを参照してください。

開発者は、データベースをいつどのようにアップグレードするかを選択できますが、Migrations とデプロイメントの更新を使用している場合は次の点に注意してください。

  1. 新しいコード コードは、古いデータ スキーマに対して簡単に実行できません。
  2. 古いコード/アプリが再起動すると、多くのデフォルトの初期化戦略がスキーマのロールバックを試みます。これが発生した場合は、ポイント 1 を参照してください。;)
  3. 間違ったバージョンのスキーマに対してロードする EF モデルを回避すると、そこにないスキーマ要素をコードが使用しようとすると、例外と一般的なエラーが発生します。

ライブ サイトで EF 移行を管理する最も簡単な方法は、EF 移行を含む展開のためにサイトのすべてのインスタンスを停止することです。メンテナンス ページまたはリダイレクトを使用できます。

この問題が発生する場合は、DB の更新を手動で適用することをお勧めします。失敗した場合は、展開がまだ開始されていないため、簡単に中止できます。

それ以外の場合は、更新をデプロイすると、起動する最初のインスタンスが移行を実行します (初期化子がそうするように構成されている場合)。

サイト コード/コンテンツとモデルの更新の両方を継続的に展開する必要がある場合、EF 移行は、このシナリオでは非常に制限的な OOTB であることがわかるため、開始するのに最適なツールではない可能性があります。

于 2015-09-09T08:41:07.223 に答える
0

一般的に言えば、アクティブなアップグレードをサポートしたい場合は、アプリケーションの複数のバージョンを同時にサポートする必要があります。これは、移行/アップグレード中に確実にアクティブな状態を維持する唯一の方法です。また、制御された方法で変換をスケールアップするための機能スイッチも検討してください。

于 2015-07-01T20:39:49.433 に答える
0

Pluralsight で「基礎」コースを見ていましたが、これに触れました。3 つのサイトがある場合、Azure は 1 つをオフラインにしてアップグレードし、準備ができたら再起動します。その時点で、他の 2 つのインスタンスがオフラインになり、アップグレードされたインスタンスが開始され、スキーマの変更が実行されます。

これら 2 つが戻ってくると、EF の移行は既に実行されているため、サイトが戻ってきます。

理論的には、すべてが機能するはずですが、実行する必要がある EF 移行の量によっては、要求が遅れる場合があります。

ただし、著者からのコメントは、このシナリオ (スキーマの変更など) では、Web サイトがこの状況で実行できるかどうかを検討する必要があるというものでした。古いスキーマと新しいスキーマの両方でコードを機能させるか、「メンテナンス システムのダウン ページ」を表示する必要があるという提案があります。

要約すると、実際にアップグレードしているものに応じて、これは展開の選択と方法に影響を与えます。

于 2013-11-11T17:04:52.413 に答える