有谁知道OfflineFirst设计中客户端缓存策略的聪明或标准解决方案。
我有一个Ionic2(Angular2/TypeScript(客户端,并且正在尝试遵循OfflineFirst原则,因此假设存在不可预测的连接。我只想下载自上次客户端更新以来已更改的在多个用户之间共享的多对多关系的对象,并且仅使用自上次更新以来的更改来更新客户端的本地存储。
这是我目前的印象: - 任何推送策略似乎都没有意义,首先是离线的?所以一些建议是使用可观察/观察者模式,但这使用推送策略,我认为这不是一个好的解决方案。 - 我考虑过在服务器上存储一个用户最后更新键值对以及每个对象的 lastupdate ts,然后在每次客户端联机时比较 2 并 ping 以获取新的更新。如果有更新,则使用比上次用户更新 TS 更新的 TS 下载这些对象。 - 我也看到过一些关于服务人员的提及,但并不熟悉。 - 其他人选择了昂贵的解决方案,只需对定期 ping 进行完全刷新,即每天,每 4 小时左右。
任何见解都会很棒。
我在使用 CouchDB(或相关技术,如 Cloudant(的 Offline First 应用程序中看到的典型模式是执行所谓的每个用户一个数据库。基本思想是在注册应用程序时为每个用户分配一个 CouchDB 数据库。然后,只允许每个用户读取/写入该用户的 CouchDB 数据库。像Hoodie或Cloudant Envoy这样的工具(Envoy向客户端提供了每个用户一个数据库的"错觉"(可以帮助解决这个问题:
- http://hood.ie/
- https://github.com/cloudant-labs/envoy
此方法适用于具有细分良好的用户数据(例如个人待办事项列表(的应用,并且横向扩展效果出奇地好。但是,当您想要在用户之间共享数据(例如共享的 TODO 列表(或想要跨用户对聚合数据运行分析时,这种方法会带来挑战。
您的应用似乎属于此"用户之间的共享数据"类别。挑战在于,如何将共享数据从用户数据库 A 获取到用户数据库 B 中?在CouchDB中,这些共享数据将表示为JSON文档。
一种体系结构是使用消息队列,其中为每个用户数据库分配了发布者和订阅者代理。这些代理将在服务器端运行,在您的安全策略中,确定谁有权访问哪些数据。这些代理将订阅其他用户数据库中的数据"通道",另一方面发布到数据的"通道"。这些通道可以由数据库中文档中包含的特定属性定义。当代理检测到所描述的事件时,它会运行筛选的复制,将有问题的数据从一个用户数据库复制到另一个用户数据库。