在当今世界,许多计算机、移动设备或网络服务共享数据或充当集线器,同步变得更加重要.众所周知,同步的解决方案并不是最舒适的解决方案,最好不要同步.

我仍然很好奇您将如何实现同步解决方案来在多个实体之间进行同步.已经有很多不同的方法,比如比较更改的日期字段或散列并使用最新的数据,或者让用户在发生冲突的情况下 Select 他想要使用的.另一种方法是try 自动合并冲突的数据(在我看来,这不是很聪明,因为机器无法猜测用户的意思).

总之,在开始实施同步之前,我们应该回答几个与同步相关的问题:

  • 最新的数据是什么?我想要如何代表它呢?
  • 如果发生冲突我该怎么办?合并?我是否要提示并询问用户要做什么?
  • 当我进入不一致的状态(例如,由于移动网络连接故障而断开连接)时,我该怎么办?
  • 当我不想陷入一种不一致的状态时,我该怎么办?
  • 如何恢复被中断的当前同步?
  • 如何处理数据存储(例如,Web服务上的MySQL数据库、iPhone上的核心数据;以及如何在没有大量粘合代码的情况下合并/同步数据)?
  • 我应该如何处理用户在同步期间进行的编辑(它在后台运行,这样UI就不会被阻止)?
  • 我如何传播更改以及向哪个方向传播更改(例如,用户在其计算机上创建了一个"foo"条目但没有同步;然后他在路上创建了另一个"foo"条目;当他try 同步两个设备时会发生什么情况)?用户是否会有两个具有不同唯一ID的"foo"条目?用户是否只有一个条目,但是是哪一个条目呢?
  • 当我有分层数据时,我应该如何处理同步?自上而下?自下而上?我是以原子方式处理每个条目,还是只查看超级 node ?过度简化和在实现上投入太多时间之间的权衡有多大?

还有很多其他的问题,我希望我能给你们足够的启发.同步是一个相当普遍的问题.一旦找到了一种好的、多功能的同步方法,将其应用到具体的应用程序应该会更容易,而不是从头开始思考.我意识到已经有很多应用程序试图解决(或成功解决)同步问题,但是它们已经相当具体了,通常对同步方法没有给出足够的答案.

推荐答案

在我工作的地方,我们开发了一个主要(网络)应用程序的"离线"版本,用户可以在没有互联网接入的地方使用笔记本电脑.当用户返回主站点时,他们需要将离线输入的数据与我们的主应用程序同步.

所以,为了回答你们的问题:

  • 最近的数据是什么?我想如何代表它?

我们在每个表上都有一个最后更新的日期列.服务器会跟踪同步发生的时间,因此当脱机应用程序请求同步时,服务器会说"嘿,只给我自该日期以来更改的数据".

  • 如果发生冲突我该怎么办?合并?我是不是应该提示并询问 用户该怎么做呢?

在我们的示例中,脱机应用程序只能更新所有数据的相对较小的子集.在同步每条记录时,我们判断它是否是这些情况之一,如果是,那么我们在线和离线比较记录的LAST_UPDATED_DATE.如果日期不同,我们还会判断这些值(因为如果它们都更新为相同的值,则不会发生冲突).如果有冲突,我们会记录差异,设置一个标志表示至少有一个冲突,并继续判断睡觉的详细信息.一旦该过程完成,如果设置了"isConflict"标志,则用户能够转到显示差异的特殊页面,并决定哪个数据是"正确"版本.然后将此版本保存在主机上,并重置"isConflict"标志.

  • 当我不想进入一个矛盾的世界时,我该怎么办
  • 如何恢复被中断的当前同步?

嗯,我们一开始就尽量避免进入不一致的状态.如果同步因任何原因中断,则LAST_SYNCHRONIZATION_DATE不会更新,因此下次启动同步时,它将从与上一次(中断)同步的开始日期相同的日期开始.

  • 如何处理数据存储(例如,Web服务上的MySQL数据库、核心 iPhone上的数据;我如何 合并/同步数据,而不需要大量 gulp 代码)?

我们在两个应用程序上都使用标准数据库,中间使用Java对象.这些对象被序列化为XML(并被gzip压缩以加速传输),用于实际的同步过程,然后在每一端解压/反序列化.

  • 我应该如何处理用户在同步期间进行的编辑 (它在后台运行,因此 UI未被阻止)?

这些编辑将在同步开始日期之后进行,因此在下一次同步之前不会在另一端拾取.

  • 我如何传播更改以及向哪个方向传播更改(例如,用户创建 他电脑上的"foo"条目 不同步;那么他就在路上 创建另一个"foo"条目;什么 当他try 同步两者时发生 设备)?用户是否会有两个"foo" 具有不同唯一ID的条目? 用户是否只有一个条目,但是 哪个?

你想怎么处理这件事由你自己决定.即取决于Foo的主键是什么以及您如何确定一个Foo是否与另一个相同.

  • 当我有分层数据时,我应该如何处理同步?自上而下? 自下而上?我是不是要把每个条目 原子的,还是我只看了一个 超级 node ?

同步是原子的,因此如果一条记录失败,则整个过程被标记为未完成,类似于Subversion COMMIT TRANSACTION.

  • 过度简单化和投资之间的权衡有多大? 实施时间太长了吗?

我不确定你的确切意思,但我想说这一切都取决于你的情况和你想要同步的数据类型/数量.设计和实现这个过程可能需要很长时间,但这是可能的.

希望这对您有帮助,或者至少给您一些启发!:)

Database相关问答推荐

我们可以出于不同目的在同一 postgres 数据库上同时进行物理和逻辑复制吗?

任何必要的可空外键示例?

优雅地处理 EJB/JPA 环境中的约束冲突?

什么是范围锁( range-locks)?

更新数据库后如何更新redis?

Followers/following 关注者表数据库 struct

使用 Laravel 5.2 从存储在 Y-m-d 数据库中的日期计算年龄

使用 2 个进程处理数据库

在 phpmyadmin 中导入时如何跳过重复记录

向表中添加大量索引是否有缺点?

从数据库行在 Golang 中创建map

是什么导致pyodbcunable to connect to data source?

如果表不存在,如何使用 Derby Db 创建表

最佳用户角色权限数据库设计实践?

SQL Server Express LocalDB 可以远程连接吗?

如何在数据库中获取原始的created_at值(不是转换为 ActiveSupport::TimeWithZone 的对象)

Spring data : CrudRepository 的保存方法和更新

什么是 ACID 的真实示例?

在 Django 中,如何从数据库中 Select 100 条随机记录?

如何安装/更新到 Postgres 9.4?