- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找一些通用策略,用于将中央服务器上的数据与并不总是在线的客户端应用程序同步。
在我的特定情况下,我有一个带sqlite数据库的android手机应用程序和一个带MySQL数据库的PHP Web应用程序。
用户将能够在电话应用程序和Web应用程序上添加和编辑信息。我需要确保即使手机无法立即与服务器通信,也可以在一个地方进行更改。
我不关心如何将数据从手机传输到服务器,反之亦然。我之所以仅提及我的特定技术,是因为我无法使用例如MySQL可用的复制功能。
我知道客户端-服务器数据同步问题已经存在了很长时间,并且希望获得有关处理问题的模式的信息(文章,书籍,建议等)。我想了解处理同步以比较优点,缺点和折衷方案的一般策略。
最佳答案
您必须决定的第一件事是关于在发生冲突更改时将哪一方视为“权威”的一般政策。
即:假设记录#125在1月5日晚上10点在服务器上更改,并且同一记录在1月5日晚上11点在其中一部电话(称为客户A)上更改了。
上次同步时间是1月3日。然后,用户在1月8日重新连接。
在客户端和服务器都知道上次同步的日期的意义上,识别需要更改的内容是“容易的”,因此自上次同步以来,所有创建或更新的内容(请参见下文中的更多信息)均应如此。
因此,假设唯一更改的记录是#125。
您要么确定两个版本之一自动“获胜”,然后再覆盖另一个版本,要么需要支持协调阶段,用户可以决定哪个版本(服务器或客户端)是正确的版本,而覆盖另一个版本。
这个决定非常重要,您必须权衡客户的“角色”。特别是如果不仅客户端和服务器之间存在潜在冲突,而且如果不同的客户端可以更改同一条记录,则尤其如此。
[假设#125可以由第二个客户端(客户端B)修改,则尚未同步的客户端B可能会提供同一记录的另一个版本,从而使以前的冲突解决方法无济于事]
关于上面的“创建或更新”点...如果记录源自某个客户端,那么如何正确识别记录(假设这在您的问题域中有意义)?
假设您的应用管理一个业务联系人列表。如果客户A说您必须添加一个新创建的John Smith,并且服务器上有一个昨天由客户D创建的John Smith ...您是否创建了两个记录,因为不能确定它们不是不同的人?您还会要求用户调解此冲突吗?
客户是否拥有数据子集的“所有权”?即如果将客户B设置为区域5数据的“权威”,则客户A是否可以修改/创建区域5的记录? (这将使某些冲突的解决变得更容易,但可能对您的情况不可行)。
概括起来,主要问题是:
考虑到分离的客户端在创建新记录之前可能尚未访问服务器,如何定义“身份”。
以前的情况,无论该解决方案多么复杂,都可能导致数据重复,因此您必须预见到如何定期解决这些问题,以及如何通知客户端他们认为“记录#675”的内容实际上已被合并/取代。记录#543
决定是否通过法令来解决冲突(例如,“如果服务器版本自上次同步以来已更新,则服务器版本始终胜过客户端”)或通过手动干预来解决
如果是法定命令,尤其是如果您决定让客户端优先,则还必须注意如何处理可能会带来更多变化的其他尚未同步的客户端。
前面的内容没有考虑数据的粒度(为了使描述更简单)。只需说一下,而不是像我的示例那样在“记录”级别进行推理,您可能会发现更适合在字段级别记录更改。或者一次处理一组记录(例如,人员记录+地址记录+联系人记录),将它们的汇总视为一种“元记录”。
参考书目:
当然,有关Wikipedia的更多信息。
A simple synchronization algorithm的作者写的Vdirsyncer
OBJC article on data synch
SyncML®: Synchronizing and Managing Your Mobile Data(在O'Reilly Safari上预订)
Conflict-free Replicated Data Types
Optimistic Replication安藤靖(惠普实验室)和MARC SHAPIRO(微软研究有限公司)-ACM计算调查,第一卷。 V,N,2005年3月。
亚历山大·特劳(Alexander Traud),尤尔根·纳格勒·伊莱因(Juergen Nagler-Ihlein),弗兰克·卡格(Frank Kargl)和迈克尔·韦伯(Michael Weber)。 2008。通过重用SyncML进行循环数据同步。在第九届国际移动数据管理国际会议论文集(MDM '08)中。 IEEE计算机协会,华盛顿特区,美国,165-172。 DOI = 10.1109 / MDM.2008.10 http://dx.doi.org/10.1109/MDM.2008.10
Lam,F.,Lam,N.和Wong,R.2002。移动XML数据的高效同步。在第十一届国际信息和知识管理国际会议论文集(2002年11月4日至9日,美国弗吉尼亚州麦克莱恩)上。 CIKM '02。 ACM,纽约,纽约,153-160。 DOI = http://doi.acm.org/10.1145/584792.584820
Cunha,P.R。和Maibaum,T.S.,1981年。Resource&equil;抽象数据类型+同步-面向消息的编程方法-。第五届软件工程国际会议论文集(1981年3月9日至12日,美国加利福尼亚州圣地亚哥)。国际软件工程大会。 IEEE Press,Piscataway,NJ,263-272。
(最后三个来自ACM数字图书馆,不知道您是会员还是可以通过其他渠道获得)。
从Dr.Dobbs站点:
使用SQL Server CE和SQL RDA创建应用程序,作者Bill Wagner,2004年5月19日(为台式机和移动PC设计应用程序的最佳做法-Windows / .NET)
来自arxiv.org:
A Conflict-Free Replicated JSON Datatype-本文描述了JSON CRDT的实现(无冲突的复制数据类型-CRDT-是支持并发修改并保证此类并发更新收敛的数据结构家族)。
关于sql - 同步客户端-服务器数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26794483/
我的问题是如何在 python 中创建一个简单的数据库。我的例子是: User = { 'Name' : {'Firstname', 'Lastname'}, 'Address' : {'Street
我需要创建一个与远程数据库链接的应用程序! mysql 是最好的解决方案吗? Sqlite 是唯一的本地解决方案吗? 我使用下面的方法,我想知道它是否是最好的方法! NSString *evento
给定两台 MySQL 服务器,一台本地,一台远程。两者都有一个包含表 bohica 的数据库 foobar。本地服务器定义了用户 'myadmin'@'%' 和 'myadmin'@'localhos
我有以下灵活的搜索查询 Select {vt:code},{vt:productcode},{vw:code},{vw:productcode} from {abcd AS vt JOIN wxyz
好吧,我的电脑开始运行有点缓慢,所以我重置了 Windows,保留了我的文件。因为我的大脑还没有打开,所以我忘记事先备份我的 MySQL 数据库。我仍然拥有所有原始文件,因此我实际上仍然拥有数据库,但
如何将我的 Access 数据库 (.accdb) 转换为 SQLite 数据库 (.sqlite)? 请,任何帮助将不胜感激。 最佳答案 1)如果要转换 db 的结构,则应使用任何 DB 建模工具:
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
我想在相同的 phonegap 应用程序中使用 android 数据库。 更多说明: 我创建了 phonegap 应用程序,但 phonegap 应用程序不支持服务,所以我们已经在 java 中为 a
Time Tracker function clock() { var mytime = new Date(); var seconds
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
我有一个可以收集和显示各种测量值的产品(不会详细介绍)。正如人们所期望的那样,显示部分是一个数据库+建立在其之上的网站(使用 Symfony)。 但是,我们可能还会创建一个 API 来向第三方公开数据
我们将 SQL Server 从 Azure VM 迁移到 Azure SQL 数据库。 Azure VM 为 DS2_V2、2 核、7GB RAM、最大 6400 IOPS Azure SQL 数据
我正在开发一个使用 MongoDB 数据库的程序,但我想问在通过 Java 执行 SQL 时是否可以使用内部数据库进行测试,例如 H2? 最佳答案 你可以尝试使用Testcontainers Test
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 此问题似乎与 a specific programming problem, a sof
我正在尝试使用 MSI 身份验证(无需用户名和密码)从 Azure 机器学习服务连接 Azure SQL 数据库。 我正在尝试在 Azure 机器学习服务上建立机器学习模型,目的是我需要数据,这就是我
我在我的 MySQL 数据库中使用这个查询来查找 my_column 不为空的所有行: SELECT * FROM my_table WHERE my_column != ""; 不幸的是,许多行在
我有那个基地:http://sqlfiddle.com/#!2/e5a24/2这是 WordPress 默认模式的简写。我已经删除了该示例不需要的字段。 如您所见,我的结果是“类别 1”的两倍。我喜欢
我有一张这样的 table : mysql> select * from users; +--------+----------+------------+-----------+ | userid
我有表: CREATE TABLE IF NOT EXISTS `category` ( `id` int(11) NOT NULL, `name` varchar(255) NOT NULL
我是一名优秀的程序员,十分优秀!