你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

IStateReplicator.ReplicateAsync 方法

定义

将状态更改从主副本 (replica) 复制到次要副本,并接收已应用这些状态更改的仲裁确认。

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主副本 (replica) 要复制的状态更改的 。

cancellationToken
CancellationToken

已丢失的副本的写入仲裁。 它可用于发送应取消操作的通知。 请注意,取消是建议,即使取消了操作,操作仍可能已完成。

sequenceNumber
Int64

Long,操作的 LSN。 请注意,此值与任务返回的值相同。 将其作为 out 参数提供对于想要准备本地写入以在任务完成时提交的服务很有用。

返回

返回 Task<TResult> long 类型的 ,即操作的 LSN。

例外

由以下原因之一引起:

当一个或多个参数无效时,将返回E_INVALIDARG。

FabricTransientException 是可重试的异常。 这是由以下原因之一引起的:

NoWriteQuorum 当复制器当前没有写入仲裁时返回 。

ReconfigurationPending 当复制器具有挂起的重新配置时,将返回 。

ReplicationQueueFull 复制器队列已满时返回 。

FabricNotPrimaryException 由以下原因之一引起:

NotPrimary 当复制器具有挂起的重新配置时,将返回 。

FabricObjectClosedException 由以下原因之一引起:

ObjectClosed 复制器关闭时返回 。

OperationCanceledException 由以下原因之一引起:

复制程序取消正在进行的复制操作时E_ABORT。

注解

主副本 (replica) 上的复制生成实现IOperation辅助副本 (replica) 通过 GetReplicationStream()从复制流获取的对象,后跟 GetOperationAsync(CancellationToken)

主要副本 (replica) 有许多与进程状态更新相关的职责。 以下步骤显示了主要副本 (replica) 复制和确认更改时必须处理的常规事件序列。

第 1 部分:处理传入请求:接收请求:写入 (x) – 服务接收写入请求,x。 CheckArguments – 服务检查请求的参数。 此检查有助于确保服务状态的一致性。

检查当前状态 – 服务检查其当前状态,以确保操作有效且可以或应该执行。 此检查还有助于确保数据一致性。 它由服务代码执行。

获取锁 – 服务应获取必要的锁,以防止同时发生其他操作。 此操作有助于确保隔离和一致性。

尝试操作 (可选) – 服务可以在本地尝试操作。 此步骤保留和分配空间,并执行所有必要的计算。 此步骤包括除实际提交结果之外的所有内容。 此操作可提高操作的持久性,并使以后的故障不太可能发生。

制造 OperationData - 对象 OperationData 是呈现给服务的写入 (x) 的表示形式。 对象OperationData包含要通过确认从主要副本 (replica) 传输到次要副本的状态更改。 服务放置在 OperationData 中的数据定义传输到次要副本的 FabricReplicator 原子更新。 请注意,创建 OperationData 对象需要一个或多个字节数组。 服务本身必须确定并序列化状态更改,然后通过 ReplicateAsync(OperationData, CancellationToken, Int64)向 FabricReplicator 提供这组字节。 服务将操作发送到 FabricReplicator,并接收逻辑序列号 (LSN) 作为回报。 LSN 是操作的标识,可帮助服务和 Service Fabric 确保操作始终按同一顺序应用到任何位置。服务应将 OperationData 及其 LSN 记录在未完成操作的有序列表中。 这可确保操作完成后,可以一致地按正确的顺序应用这些操作。

释放锁 - 继续处理或等待进一步的请求。

第 2 部分:完成请求和响应:主副本 (replica) 收到一个回调,指示操作已应用。 ReplicateAsync 已完成。 此回调指示操作已由副本 (replica) 集中的副本仲裁确认。 当主副本 (replica) 收到此回调时,它应执行以下操作:

在服务的未完成列表中找到从 ReplicateAsync 返回的长 LSN 指示的相应操作,并将其标记为“QuorumAck'd”。

现在,从正在进行的列表中的第一个操作开始,浏览列表并在本地提交所有 QuorumAck'd 操作,完成对本地状态的任何更改,并使用相应的 LSN 标记状态更改,直到遇到第一个未完成的操作。 这可确保 (一致性) 保留排序,并实际应用操作。 这利用了以前的持久性和隔离准备。 注意:大多数服务应缓存上次提交的 LSN 值,以便对 GetLastCommittedSequenceNumber() 的响应不需要在实际存储中查询最大 LSN。

在主副本 (replica) 成功提交操作后,主副本 (replica) 现在可以回复发起调用的客户端,并从未完成列表中删除该操作。 继续等待下一个仲裁确认回调。

适用于