架构用于数据层同时使用的localStorage和一个REST远程服务器(Architecture

2019-08-03 06:21发布

任何人对如何实现既使用localStorage的和REST远程存储数据持久层的任何意见或引用:

某一客户端的数据存储在与localStorage的(使用余烬数据索引资料适配器)。 本地存储的数据(使用余烬数据RESTadapter)与远程服务器同步。

服务器从客户端收集的所有数据。 使用数学组符号:

Server = Client1 ∪ Client2 ∪ ... ∪ ClientN 

其中,在一般情况下,任何记录可能不是唯一到一定的客户:

ClientX ∩ ClientY ≠ 0,  ∀ X,Y ∈ [1,N]

这里是一些假设:

  • 客户端创建一个记录。 该记录的ID不能在客户端上进行设置,因为它可能与存储在服务器上记录冲突。 因此,一个新创建的记录需要提交到服务器 - >收到的ID - >创建的localStorage记录。

  • A记录在服务器上更新,并因此在localStorage的,并在服务器上的数据不同步。 只有服务器知道,这样的架构需要实现按键架构(?)

你会使用2个店(一个用于本地存储,一个REST),并同步在它们之间,或使用混合索引资料/ REST适配器和适配器中编写的同步码?

你能看到的任何方式,以避免实施推(网络插座,...)?

Answer 1:

你带了的问题不能用三言两语来回答,或者干脆回答。 不过,这里是我的尝试...

首先,有与你采取的做法困难号码:

  1. 客户端必须始终网络连接到创建的数据以及从服务器接收钥匙。
  2. 如果你做出不同的商店(localStorage的和REST),所有的应用程序代码需要数据必须看在两家超市。 这显著增加了应用程序的每一个部分的复杂性。
  3. 创建一行后,如果您要创建子行,你必须等待服务器返回的主键,然后才能引用它的子行的外键。 对于任何中等复杂的数据结构,这将成为一个沉重的负担。
  4. 当服务器出现故障,所有客户端无法创建数据。

这里是我的方法。 它采用SequelSphereDB ,但大多数的概念可以在其他客户端的数据管理系统中重复使用。

第一:使用的UUID的主键。

大多数客户数据管理系统应该生成通用唯一ID提供的方式。 SequelSphere做它用简单的SQL函数:UUID()。 有一个UUID作为每一行的主键允许在任何时间任何客户端上生成的主键,而无需联系服务器,仍然保证ID将是唯一的。 这也因此使得应用能够在“离线”模式下工作,不需要在运行时服务器的连接。 这也使从把所有的客户端下关闭服务器。

第二:使用单组镜像服务器的表。

这更多的是为了简单起见,比什么都重要的要求。 这也是接下来的两个基本原则的要求。

第三:对于小数据集的向下的同步,从服务器完全清爽客户机数据是优选的。

只要有可能,从服务器的客户端上执行数据的完全刷新。 这是一个简单的管理模式,并在更短的内部数据完整性问题的结果。 的主要缺点是在传送数据大小。

第四:对于大型数据集的向下的同步,执行“交易”更新

这是我的做法变得有点复杂。 如果数据集太大,并且只需要改变行可以同步,你必须找到一种方法根据“交易”同步他们。 那就是:在它们被在服务器上执行,以执行在客户端上提供相同的简单脚本的顺序插入/更新/删除。

优选的是让服务器记录到可以同步下来到设备上的交易上的表。 如果这是不可能的,那么该命令往往可以在服务器上使用的行时间戳,以及具有客户端请求,因为一个特定的时间戳的所有更改记录。 大利空:您将需要保持由删除的行任一音轨“逻辑”中删除,或者在自己的表中跟踪它们。 即便如此,隔离复杂的服务器最好在所有客户端传播它。

第五:对于向上的同步,用“交易”的更新

这是SequelSphereDB真正的亮点:它会让你所有的插入,更新的跟踪和删除对表执行,然后提供他们回到你的同步时间。 它甚至做它跨浏览器重新启动,因为它坚持的localStorage / IndexedDB的信息。 它甚至处理提交和回滚适当。 该客户端应用程序可以使用数据,因为它通常会进行交互,而无需给予思考记录的更改,然后使用SequelSphereDB的“更改跟踪器”重播在同步时间的变化。

如果你不使用 SequelSphere(你应该),然后保持一个单独的表在客户端上记录所有的插入,更新和删除客户端执行。 每当客户端应用程序的插入/更新/删除行,做出一个副本,在“交易”表。 在向上同步时间,把那些。 在服务器上,简单地执行以相同的顺序进行复制,这是客户端上的数据相同的步骤。

也很重要:始终从服务器完全刷新客户端表之前进行向上同步。 :)

结论

我建议在尽可能多的地方尽量在复杂性去为简单。 使用UUID主键是这个非常有帮助。 使用某种“变化跟踪”的也是非常有用的。 使用工具如SequelSphereDB跟踪变化对你来说是最有帮助的,但没有必要为这种方法。

全面披露:我是密切相关的公司SequelSphere,但该产品真的是没有必要的实施上面方法。



文章来源: Architecture for data layer that uses both localStorage and a REST remote server