直写式和后写式缓存概述
直写式和后写式是两种常用的缓存策略。 NCache 为了保持缓存数据与数据源的一致性,它们提供了内置机制,可以自动将分布式缓存与底层数据源同步,使应用程序能够根据工作负载需求,在同步一致性或高性能异步更新之间进行选择。
NCache 支持直写式缓存,允许通过缓存直接对数据源执行写入操作。这样,您可以同步缓存和数据源。在直写式缓存中, NCache 首先更新缓存存储,然后将该操作应用于数据源。例如,如果客户端应用程序更新了缓存中的某个条目,那么 NCache 同时还会更新数据源(如果启用了直写功能)。
要在应用程序中使用直写式缓存,您需要首先实现以下功能: IWriteThruProvider 界面。 NCache 内部将使用此自定义提供程序对数据源执行写入操作。 NCache 将在写入操作(添加、插入、删除)API 调用后调用您的提供商,并启用直写功能。
目前 NCache 提供两种直写式缓存模式,如下所示:
- 直写 (同步更新数据源)
- 后写 (异步更新数据源)
注意:
NCache 提供性能计数器 Write-thru/sec 用于直写操作。
什么是直写式缓存
在直写缓存中,操作首先应用于缓存存储,然后同步更新到配置的数据源。使用直写缓存,操作将在以下情况下完成: NCache 将该操作应用于数据源。如果即时数据源更新至关重要,并且您需要在缓存更新后立即更新数据源,则可以使用直写缓存。
什么是写后缓存
在直写模式下,由于数据源上的操作是同步的,因此操作速率将与用户对缓存的操作速率相同。对于用户流量较大的应用程序,用户对缓存的操作速率可能会非常高,这可能会使数据源不堪重负。此外,同步数据源操作可能会影响用户操作的响应时间。
为了克服这些问题,可以使用 Write-behind 代替 Write-through。在 Write-behind 中,数据源操作在 NCache 对缓存存储执行操作。更新缓存存储后,这些操作将排队等待,然后异步应用于已配置的数据源。因此,使用后写式缓存技术可以提高缓存操作的响应时间。
NCache 在 Write-behind 中提供了不同的配置设置来控制数据源上的操作流。例如,您可以指定 NCache 将通过Throttling对数据源应用Write-behind操作。
节流如何控制写入后性能
指示每秒应用于数据源的操作数。 节流的默认值为 500 ops/sec。 您可以通过 NCache 管理中心.
注意:
NCache 提供性能计数器 Write-behind/sec 用于后写操作。
后写模式
NCache 允许您单独或批量应用 Write-behind 操作。Write-behind 操作会维护一个 Write-behind 队列。所有 Write-behind 操作都将在此队列中排队,然后根据配置的批处理或非批处理模式应用于已配置的数据源,如下所述。
非批处理模式
默认情况下,Write-behind 操作将配置为非批处理模式。在此模式下,Write-behind 队列中的操作将根据配置的节流率逐一应用于数据源。例如,如果节流率为每秒 500 次操作, NCache 将每次将一个后写操作应用于数据源,并且每秒不会超过 500 个操作。
批处理模式
在批处理模式下,根据操作选择批处理/批量操作 operation delay. 你可以配置 operation delay 对于 Write-behind 操作,表示每个操作在应用于数据源之前必须在 Write-behind 队列中等待的时间(以毫秒为单位)。默认情况下,其值为零。
批处理间隔是可配置的间隔,根据该间隔 NCache 定期检查 Write-behind 队列中是否存在操作延迟超时操作。例如,如果操作延迟配置为 1000 毫秒,批处理间隔配置为 5 秒, NCache 每 5 秒检查一次 Write-behind 队列中的操作,并选择所有已超过操作延迟的操作(所有在队列中等待最后 1000 毫秒的操作)。
批量选择操作后,将根据配置的节流率将其应用于数据源。假设从 Write-behind 队列中选择了 1000 个操作,然后以 500 个操作为一批将其应用于数据源(如果节流率为 500 ops/sec),因为每秒应用于数据源的最大操作不能超过配置的节流值。
您可以指定从几秒到几天和几个月的操作延迟时间。 通过这种方式,您可以在可配置的时间内暂停对数据源的操作。 NCache 还提供了 Write-behind 队列、操作计数和当前批处理操作计数的性能计数器。对于 Write-behind,如果启用了批处理,则已准备好在数据源上执行的操作将从 Write-behind 队列中出队。
注意:
当前批处理间隔中出列的操作数将由 当前批处理操作计数计数器.
热应用支持
NCache 支持热应用的 Write-behind 设置,允许您在运行时更改 Write-behind 配置,而无需停止缓存。您可以通过 NCache 管理中心及 NCache 将动态合并这些更改。
在热应用支持中,你可以将 Write-behind 模式从批处理更改为非批处理,反之亦然。例如,如果你已将批处理模式更改为非批处理,那么 NCache 将忽略操作延迟值,并逐个执行操作。此外,您可以根据需要在运行时更改节流率;类似地,操作延迟、批处理间隔、失败操作队列限制和失败操作驱逐率也可以在运行时更改。
警告
你只能增加失败操作队列限制的值;否则, NCache 将使用其默认值进行进一步的操作。
集群环境中的后写
由于为 Write-behind 操作维护了一个 Write-behind 队列,因此有一个单独的专用线程监视器执行其操作。Write-behind 的拓扑级别详细信息如下:
复制拓扑: 所有节点上都维护有 Write-behind 队列,但 Write-behind 异步处理器仅存在于协调器节点上。这意味着所有 Write-behind 操作都通过此节点执行,并复制到集群范围内的其他节点队列。这样,如果某个节点发生故障,则下一个协调器节点将执行所有剩余的 Write-behind 操作。
分区副本拓扑: 每个活动节点上都维护有 Write-behind 队列,并将其复制到相应的副本。每个节点负责其对数据源的 Write-behind 操作。
分区拓扑: 每个分区上都维护一个后写队列,每个节点负责其对数据源的后写操作。
缓存操作结果
NCache 为您提供了根据操作结果在缓存中同步写入操作的灵活性。在数据源上应用操作(添加/插入)后,您可以根据以下条件指定操作状态: NCache 将同步缓存存储。 例如,在数据源操作失败的情况下,您可以决定从缓存中删除或保留该数据。 您还可以在数据源上重试该操作。 为此,您必须指定 Success/Failure/FailureRetry/FailureDontRemove as
OperationResult.Status of OperationResult. 这在 Write-through 和 Write-behind 缓存中均有提供。
数据源运行状态及其对应的动作由 NCache 描述如下:
成功:这表示数据源操作成功,项目已添加到数据源中,所以 NCache 也会将其保存在缓存中。
失败: 这表示数据源操作失败,无法将项目添加到数据源,所以 NCache 也会将其从缓存中删除。
失败不要删除:这表示数据源操作失败,无法将项目添加到数据源,但是 NCache 会将其保存在缓存中。
失败重试:这表示数据源操作失败,无法将项目添加到数据源,所以 NCache 将该项目保留在缓存中并重试。重试将作为后写操作完成。
重试失败的操作
NCache 允许您在数据源上失败时重试直写/后写操作。为此,如果您启用操作重试,则 NCache 将在数据源上重试该操作。如果是 Write-through 或 Write-behind,所有重试操作都将重新排队到 Write-behind 队列,这意味着 Write-through 重试操作将作为 Write-behind 操作异步重试。
注意:
NCache 还提供了一个性能计数器 Datasource failed operations/sec. 对返回的数据源执行的写操作 Failure/FailureRetry/FailureDontRemove as OperationResult.Status of
OperationResult 此计数器每秒计数。
NCache 允许您限制失败操作的重试次数。在这种情况下,您可以通过以下方式指定失败操作队列限制:
NCache 管理中心,如果超出该限制,您可以通过可配置的驱逐率驱逐失败的操作。在这里, NCache 当重试队列已满时,将驱逐大多数重试操作。 每个操作都有一个 RetryCount 与其关联的属性,该属性在数据源上重试每次操作时都会增加。
为了这, NCache 提供了一个性能计数器
Write-behind failure retry count 和 Write-behind evictions/sec。 该 Write-behind failure retry count
显示重新排队重试的操作数。 数据源写操作返回 FailureRetry as Status in OperationResult 将重新排队重试。 然而, Write-behind evictions/sec 计数器显示每秒驱逐的重试操作数。
数据源操作后更新缓存
如前所述,在直写缓存中,操作首先在缓存存储上执行,然后对数据源执行。可能存在这样的情况:在对数据源执行操作后,数据会被修改,例如,在标识列的情况下,其值可能会被数据源操作修改。在这种情况下,缓存和数据源中的数据可能会变得不一致。为了处理这个问题, NCache 允许您指定是否在数据源操作后更新缓存中的数据。 您可以启用 UpdateInNCache 标志在缓存存储上再次执行操作(添加/插入),使其与数据源同步,从而通过 Write-through 缓存同步更新缓存存储中的操作或通过 Write-behind 缓存异步更新缓存存储中的操作。
注意:
NCache 还提供了一个性能计数器 Datasource updates/sec 显示数据源写入操作后缓存中每秒更新操作的数量。
在本节中
配置直写提供程序
解释了直写式提供程序接口,并提供了该接口的示例实现。
使用直写式
提供使用 Write-through 进行基本操作的示例 NCache.
使用后写
提供使用 Write-behind 进行基本操作的示例 NCache.