データのシリアル化がアプリケーションのアップグレードに与える影響

アプリケーションのローリング アップグレードでは、アップグレードはノードのサブセットに、一度に 1 つのアップグレード ドメインのみに適用されます。 このプロセス中に、一部のアップグレード ドメインがアプリケーションの新しいバージョンになり、一部のアップグレード ドメインはアプリケーションの以前のバージョンになります。 ロールアウト時に、アプリケーションの新しいバージョンは、古いバージョンのデータを、アプリケーションの古いバージョンは新しいバージョンのデータを読み取ることができる必要があります。 データ形式の上位互換性と下位互換性がない場合は、アップグレードが失敗するか、データが失われたり、破損したりするおそれがあります。 この記事では、データ形式の構成要素と、データが上位互換性と下位互換性を確保するためのベスト プラクティスについて説明します。

データ形式の構成要素

Azure Service Fabric では、永続化されレプリケートされたデータが C# クラスから取得されます。 Reliable Collections を使用するアプリケーションの場合、このデータは信頼性の高いディクショナリとキューのオブジェクトです。 Reliable Actorsを使用するアプリケーションの場合は、アクターのバッキング ステートです。 これらの c# クラスは、永続化されレプリケートされるよう、シリアル化可能である必要があります。 そのため、データの形式は、シリアル化されるフィールドやプロパティ、シリアル化の方法によっても定義されます。 たとえば、IReliableDictionary<int, MyClass> では、データはシリアル化された int で、シリアル化された MyClass です。

結果的にデータ形式が変更されるコード変更

C# クラスによって、データ形式が決まるため、クラスへの変更によってデータ形式が変わることがあります。 ローリング アップグレードで、データ形式の変更を処理できるようにするには、特に注意する必要があります。 データ形式が変更される可能性のある例:

  • フィールドまたはプロパティを追加または削除する
  • フィールドまたはプロパティの名前を変更する
  • フィールドまたはプロパティの種類を変更する
  • クラスの名前または名前空間を変更する

データ コントラクトが既定のシリアライザーです

通常、このシリアライザーには、データが古いまたは 新しい バージョンの場合でも、データを読み取り、現在のバージョンにシリアル化を解除する役割があり。 既定のシリアライザーは、バージョン管理を適切に定義された規則を持つ データ コントラクト シリアライザーです。 Reliable Collections では、シリアライザーをオーバーライドできますが、Reliable Actors では現在のところオーバーライドできません。 データ シリアライザーは、ローリング アップグレードを有効にする際に重要な役割を果たします。 データ コントラクト シリアライザーは、Service Fabric アプリケーションに推奨されるシリアライザーです。

データの形式がローリング アップグレードに与える影響

ローリング アップグレード中に、シリアライザーが古いバージョンと 新しい バージョンのデータを発見する可能性がある主なシナリオは 2 つあります。

  1. ノードがアップグレードされ、バックアップを開始すると、新しいシリアライザーは古いバージョンで保存されたデータを読み込みます。
  2. ローリング アップグレード中、クラスターにコードの古いバージョンと新しいバージョンが混在します。 レプリカは異なるアップグレード ドメインで配置されることがあり、互いにデータを送信するため、新規と既存の両方のバージョンのデータが、新規または既存のバージョンのシリアライザーによって検出される可能性があります。

注意

ここでは、"新しいバージョン" と "古いバージョン" は実行中のコードのバージョンを指します。 "新しいシリアライザー" は、アプリケーションの新しいバージョンで実行される、シリアライザーのコードを指します。 "新しいデータ" は、アプリケーションの新しいバージョンからのシリアライズされた C# クラスを指します。

コードとデータ形式の 2 つのバージョンは、上位互換性と下位互換性の両方がある必要があります。 互換性がない場合は、ローリング アップグレードが失敗するか、データが失われる可能性があります。 コードまたはシリアライザーが古いバージョンを検出した時に、例外またはエラーをスローする可能性があるため、ローリング アップグレードが失敗することがあります。 たとえば、新しいプロパティが追加され、古いシリアライザーが逆シリアル化中にそれを破棄する場合、データが失われることがあります。

データ コントラクトは、データの互換性を確保するための推奨されるソリューションです。 これには、フィールドの追加、削除、変更用に適切に定義されたバージョン管理規則があります。 また、不明なフィールドの処理、シリアル化と逆シリアル化プロセスへのフッキング、クラスの継承に対するサポートもあります。 詳細については、「データ コントラクトの使用」をご覧ください。

次のステップ

Visual Studio を使用したアプリケーションのアップグレード に関する記事では、Visual Studio を使用してアプリケーションをアップグレードする方法について説明します。

PowerShell を使用したアプリケーションのアップグレードに関する記事では、PowerShell を使用したアプリケーションのアップグレードについて説明します。

アップグレード パラメーターを使用して、アプリケーションのアップグレード方法を制御します。

高度なトピック」を参照して、アプリケーションをアップグレードするときの高度な機能の使用方法を学習します。

アプリケーションのアップグレードのトラブルシューティング」の手順を参照して、アプリケーションのアップグレードでの一般的な問題を修正します。