次の方法で共有


IStateReplicator.ReplicateAsync メソッド

定義

状態の変更をプライマリ レプリカからセカンダリ レプリカにレプリケートし、それらの状態変更が適用されたことを示すクォーラム確認を受け取ります。

public System.Threading.Tasks.Task<long> ReplicateAsync (System.Fabric.OperationData operationData, System.Threading.CancellationToken cancellationToken, out long sequenceNumber);
abstract member ReplicateAsync : System.Fabric.OperationData * System.Threading.CancellationToken * int64 -> System.Threading.Tasks.Task<int64>
Public Function ReplicateAsync (operationData As OperationData, cancellationToken As CancellationToken, ByRef sequenceNumber As Long) As Task(Of Long)

パラメーター

operationData
OperationData

OperationDataプライマリ レプリカがレプリケートする状態変更を表す 。

cancellationToken
CancellationToken

失われたレプリカの書き込みクォーラム。 操作を取り消す必要があることを示す通知を送信するために使用できます。 取り消しはアドバイザリであり、取り消された場合でも操作が完了する可能性があることに注意してください。

sequenceNumber
Int64

Long、操作の LSN。 これは、タスクによって返されるのと同じ値であることに注意してください。 out パラメーターとして指定すると、タスクの終了時にコミットするローカル書き込みを準備するサービスに役立ちます。

戻り値

Task<TResult> long 型 (操作の LSN) を返します。

例外

次のいずれかが原因で発生します。

E_INVALIDARGは、1 つ以上の引数が無効な場合に返されます。

FabricTransientException は再トリガー可能な例外です。 これは、次のいずれかによって引き起こされます。

NoWriteQuorum は、レプリケーターが現在書き込みクォーラムを持っていない場合に返されます。

ReconfigurationPending は、レプリケータに保留中の再構成がある場合に返されます。

ReplicationQueueFull は、レプリケーター キューがいっぱいになると返されます。

FabricNotPrimaryException は、次のいずれかによって発生します。

NotPrimary は、レプリケータに保留中の再構成がある場合に返されます。

FabricObjectClosedException は、次のいずれかによって発生します。

ObjectClosed は、レプリケータが閉じられたときに返されます。

OperationCanceledException は、次のいずれかによって発生します。

レプリケータがインフライト レプリケーション操作を取り消すときにE_ABORTします。

注釈

プライマリ レプリカでのレプリケーションでは、セカンダリ レプリカが を介してGetReplicationStream()レプリケーション ストリームから取得する を実装IOperationするオブジェクトが生成されます。その後に が続きますGetOperationAsync(CancellationToken)

プライマリ レプリカには、プロセス状態の更新に関連する多くの職務があります。 次の手順は、プライマリ レプリカが変更をレプリケートして確認するために処理する必要があるイベントの一般的なシーケンスを示しています。

パート 1: 受信要求の処理: 受信要求: Write(x) – サービスは書き込み要求 x を受信します。 CheckArguments – サービスは要求の引数をチェックします。 このチェックは、サービスの状態の一貫性を確保するのに役立ちます。

現在の状態を確認する – サービスは現在の状態を調べて、操作が有効であり、実行できる、または実行する必要があることを確認します。 このチェックは、データの一貫性を確保するのにも役立ちます。 これはサービス コードによって実行されます。

ロックの取得 – サービスは、追加の操作が同時に発生しないように、必要なロックを取得する必要があります。 この操作は、分離と一貫性を確保するのに役立ちます。

試行操作 (省略可能) – サービスはローカルで操作を試行できます。 この手順では、領域を予約して割り当て、必要なすべての計算を実行します。 この手順には、結果の実際のコミット以外のすべてが含まれます。 この操作により、操作の持続性が向上し、後でエラーが発生する可能性は非常に低くなります。

OperationData の製造 – OperationData オブジェクトは、サービスに提示された Write(x) の表現です。 オブジェクトには OperationData 、プライマリ レプリカからセカンダリ レプリカへの受信確認と共に転送される状態変更が含まれます。 サービスが OperationData に配置するデータによって、セカンダリ レプリカに転送される FabricReplicator アトミック更新が定義されます。 オブジェクトを作成するには、1 つ以上の OperationData バイト配列が必要であることに注意してください。 サービス自体が状態の変更を決定してシリアル化し、このバイトセットを 経由して ReplicateAsync(OperationData, CancellationToken, Int64)FabricReplicator に提供する必要があります。 サービスは FabricReplicator に操作を送信し、返される論理シーケンス番号 (LSN) を受け取ります。 LSN は操作の ID であり、サービスと Service Fabric の両方で、すべての場所で操作が常に同じ順序で適用されるようにするのに役立ちます。サービスは、OperationData とその LSN を、機内操作の順序付きリストに記録する必要があります。 これにより、操作が完了したときに、正しい順序で一貫して適用できるようになります。

[ロックの解放] - 処理を続行するか、それ以上の要求を待機します。

パート 2: 要求の完了と応答: プライマリ レプリカは、操作が適用されたことを示すコールバックを受け取ります。 ReplicateAsync が完了しました。 このコールバックは、レプリカ セット内のレプリカのクォーラムによって操作が確認されたことを示します。 プライマリ レプリカは、このコールバックを受信すると、次のアクションを実行する必要があります。

サービスのインフライト リストで ReplicateAsync から返される長い LSN によって示される対応する操作を見つけて、それを "QuorumAck'd" としてマークします。

次に、インフライト リストの最初の操作から開始し、一覧を確認し、すべての QuorumAck'd 操作をローカルでコミットし、ローカル状態への変更を完了し、最初の不完全な操作が発生するまで、対応する LSN で状態の変更をマークします。 これにより、順序が維持され (一貫性)、操作が実際に適用されます。 これは、以前の耐久性と分離の準備を利用します。 注: ほとんどのサービスでは、最後にコミットされた LSN 値をキャッシュして、 への GetLastCommittedSequenceNumber() 応答が最大の LSN の実際のストアに対してクエリを実行する必要がないようにする必要があります。

プライマリ レプリカで操作が正常にコミットされると、プライマリ レプリカは呼び出しを開始したクライアントに応答し、その操作をインフライト リストから削除できるようになりました。 次のクォーラム受信確認コールバックを待機し続けます。

適用対象