Pan*_*agi 12 rest data-synchronization ember.js ember-data
任何人对如何实现同时使用localStorage和REST远程存储的数据持久层有任何想法或参考:
某个客户端的数据与localStorage一起存储(使用ember-data indexedDB适配器).本地存储的数据与远程服务器同步(使用ember-data RESTadapter).
服务器从客户端收集所有数据.使用数学集符号:
Server = Client1 ? Client2 ? ... ? ClientN
Run Code Online (Sandbox Code Playgroud)
通常,任何记录对某个客户来说可能不是唯一的:
ClientX ? ClientY ? 0, ? X,Y ? [1,N]
Run Code Online (Sandbox Code Playgroud)
以下是一些场景:
客户创建记录.无法在客户端上设置记录的ID,因为它可能与存储在服务器上的记录冲突.因此,需要将新创建的记录提交到服务器 - >接收id - >在localStorage中创建记录.
记录在服务器上更新,因此localStorage和服务器中的数据不同步.只有服务器知道,所以架构需要实现推送架构(?)
您是否会使用2个存储(一个用于localStorage,一个用于REST)并在它们之间同步,或者使用混合索引的DB2/REST适配器并在适配器中写入同步代码?
你能看到任何避免实现推送的方法(Web Sockets,...)?
你提出的问题不能在几个段落中回答,或简单回答.不过,这是我的尝试......
首先,您采用的方法存在许多困难:
这是我的方法.它使用SequelSphereDB,但大多数概念可以在其他客户端数据管理系统中重用.
首先:将UUID用于主键.
大多数客户端数据管理系统应提供生成通用唯一ID的方式.SequelSphere使用SQL函数完成它:UUID().将UUID作为每行的主键允许在任何时间在任何客户端上生成主键,而无需联系服务器,并且仍然保证ID将是唯一的.这也因此允许应用程序以"离线"模式工作,而不需要在运行时连接到服务器.这也使得服务器倒闭不会导致所有客户端崩溃.
SECOND:使用一组镜像服务器的表.
这比其他任何事情都更简单.这也是接下来两个基本原则的要求.
第三:对于小数据集的向下同步,最好从服务器中完全刷新客户端数据.
只要有可能,从服务器执行客户端上的数据的完全刷新.它是一种更简单的范例,可以减少内部数据完整性问题.主要缺点是传输中的数据大小.
第四:对于大型数据集的向下同步,执行"事务性"更新
这是我的方法变得更复杂的地方.如果数据集太大,并且只需要更改的行进行同步,则必须找到根据"事务"同步它们的方法.即:按服务器上执行的顺序插入/更新/删除,以提供在客户端上执行相同操作的简单脚本.
最好在服务器上有一个表,用于记录要同步到设备的事务.如果无法做到这一点,那么订单通常可以使用行上的时间戳记记录在服务器上,并让客户端询问自特定时间戳以来的所有更改.大否定:您需要通过"逻辑"删除或通过在自己的表中跟踪它们来跟踪已删除的行.即便如此,将服务器的复杂性隔离在一起,最好是将其传播到所有客户端.
第五:对于向上同步,使用"交易"更新
这就是SequelSphereDB真正发挥作用的地方:它会跟踪您对表执行的所有插入,更新和删除,然后在同步时将它们提供给您.它甚至可以在浏览器重新启动时执行,因为它会将信息保留在localstorage/indexeddb中.它甚至可以适当地处理提交和回滚.客户端应用程序可以像往常一样与数据交互,而无需考虑记录更改,然后使用SequelSphereDB的"更改跟踪器"在同步时重放更改.
如果您没有使用 SequelSphere(您应该),那么在客户端上保留一个单独的表来记录客户端执行的所有插入,更新和删除.每当客户端应用程序插入/更新/删除行时,在"事务"表中复制该行.在向上同步时,发送它们.在服务器上,只需按相同的顺序执行相同的步骤即可复制客户端上的数据.
另请注意:在从服务器完全刷新客户端表之前,始终执行向上同步.:)
结论
我建议在尽可能多的地方尽量简化复杂性.使用UUID作为主键非常有用.使用某种"变换跟踪器"也非常有用.使用SequelSphereDB等工具跟踪更改对您来说是最有帮助的,但对于这种方法不是必需的.
完整披露:我与SequelSphere公司密切相关,但该产品实际上并不是实施上述方法所必需的.
| 归档时间: |
|
| 查看次数: |
2184 次 |
| 最近记录: |