简单自定义提供程序设计的注意事项
与任何生产数据存储区一样,同步操作涉及的数据存储区也应定期备份。如果必须从备份还原数据存储区,需要考虑两个主要事项:
数据存储区中在还原之后所做的变更可能不会传播到其他副本。
这可能发生在基于定位点的提供程序中,因为目标提供程序发送的、源提供程序用来枚举变更的定位点在逻辑上可能位于还原后所做的变更之后。例如,基于定位点的提供程序将变更发送到目标提供程序,这会节省用于枚举变更的定位点。将从早期备份中还原源副本并进行变更。将再次使用相同的源提供程序和目标提供程序执行同步。目标提供程序通过发送在上次同步时使用的定位点为开始。根据构造定位点的方式,源提供程序可能检测到不应枚举在还原之后所做的某些变更。
这也可能发生在完全枚举提供程序中,因为用于将版本分配给源副本上变更的滴答计数可能导致将变更检测为已过时。例如,一个完全枚举提供程序将变更发送到目标提供程序。目标提供程序应用变更,并更新其内部知识。将从早期备份中还原源副本,其中包含早期的滴答计数。将基于此早期滴答计数向源副本上所做的变更分配版本。将再次执行同步。从源提供程序枚举的某些变更具有一个滴答计数,它错误地包含在目标知识中,因此被检测为已过时而不应用于目标副本。
对于这种情形,建议的解决方案是:只要从备份还原副本,就为此副本分配一个新的副本 ID。这会将还原的副本视为一个已接收备份副本中所有数据的新副本,并将备份副本视为已从同步社区中退出。同步社区中的其他副本由于有了新的副本 ID 而不具有还原副本的知识,因此,在同步过程中可以正确发送添加到还原副本的新项。
由于简单自定义提供程序使用元数据存储服务来存储元数据,因此变更副本 ID 要求执行以下步骤。
实现此提供程序,以便它可以在为从备份中进行还原而设计的特殊模式下操作。在还原模式下,目标提供程序仅将元数据变更应用到目标副本。此提供程序不检测本地变更,且不将变更数据应用到副本。
从备份中还原副本。当从备份中还原副本之后,将创建两个提供程序实例。源提供程序表示使用旧副本 ID 的还原副本,而目标提供程序表示使用新副本 ID 和新元数据存储区的还原副本。将目标提供程序置于还原模式下。
同步源提供程序和目标提供程序。这将使用新的副本 ID 填充新的元数据存储区。
删除旧的元数据存储区,并使用新的元数据存储区和新的副本 ID 来表示此副本。现在,您可以与同步社区的剩余部分进行同步了。
当先前创建和同步了某个项之后,还原后创建的同名新项可能会导致名称冲突。例如,某个源副本存储文件。源提供程序为名为“MyChange.txt”的文件发送创建变更。将从不包含 MyChange.txt 的早期备份中还原源副本。源提供程序将创建一个新的 MyChange.txt 文件并分配一个新项 ID。将再次执行同步。当发送 MyChange.txt 的变更时,目标提供程序检测到两个 MyChange.txt 文件之间存在约束冲突,因为它们同名但项 ID 不同。
对于这种情况,建议的解决方案是处理提供程序中的约束冲突。这样,当发生名称冲突时,将其报告为约束冲突且正确解决。有关更多信息,请参见为简单提供程序处理冲突。