目前我可以想到两种方法,它取决于您在后端使用的存储选项。
如果您使用的是RDBMS备份所有数据:
用这种方法下线第一系统的问题是在发布新数据或更新现有数据时,你可能会面临冲突的可能性。
作为避免冲突发生的第一个措施,您将不得不为您的客户端中的所有对象生成唯一的ID,并以这种方式在发布到服务器上并保存在数据库中时保持唯一。为此,您可以安全地依靠UUIDs来生成对象的唯一ID。 UUID保证了分布式系统中各个系统之间的唯一性,并且取决于您的实现语言,您将拥有无任何麻烦地生成UUID的方法。
设计您的本地数据库,以便您可以在本地数据库中使用UUID作为主键。在服务器端,可以同时使用自动递增和索引的整数类型,主键和VARCHAR类型来保存UUID。服务器上的主键唯一标识该表中的对象,而UUID在表和数据库中唯一标识记录。
因此,在同步时将对象发布到服务器时,您只需检查是否存在具有UDID的任何对象并从中采取相应的操作。当您从服务器获取对象时,请从您的表中发送对象的主键和对象的UDID。这就是为什么当您在模型对象中序列化响应或将它们保存在本地数据库中时,您可以告诉已经同步的对象,而不是因为需要同步的对象在本地数据库中没有主键, UUID。
当您的服务器出现故障并且在同步时拒绝保存数据时,可能会出现这种情况。在这种情况下,您可以在对象中保留一个整数变量,以保持您尝试同步它的次数。如果此数字超过某个值(例如3),则继续同步下一个对象。现在,您对未识别的对象所做的工作就是您对这些对象的策略,作为一种解决方案,您可以丢弃它们或仅保留在本地。
如果你不使用RDBMS
作为一种替代方法,而不是使所有的对象,你可以保持每个客户端本地执行的服务器事务。每个客户端只同步事务,并且通过从下往上处理所有事务来获取当前状态。这与Git使用的非常相似。它以交易形式(比如已添加(或删除)以及由谁交易)的形式将更改保存在存储库中。每个用户的存储库的当前状态都是从事务处理的。这种方法不会导致冲突,但你可以看到它的开发有点棘手。
谢谢ANKUR的解释,感谢你在它花费的时间。我们计划使用MySQL('RDBMS')作为这个项目的数据库。 – daydreamer