V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
refresh
V2EX  ›  问与答

N 个客户端都存在离线写入数据的情况下,如何在同步的时候确定始终最新且不出错?

  •  
  •   refresh · 2020-03-15 20:14:58 +08:00 · 2303 次点击
    这是一个创建于 1711 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在有 N 个客户端,都可能会离线操作数据(插入或者更新),当在线的时候向服务器端与服务器同步数据。即将本地服务与服务端数据进行合并,以确保本地和服务器端都是最新的。
    13 条回复    2020-03-16 11:07:53 +08:00
    loading
        1
    loading  
       2020-03-15 20:19:51 +08:00 via Android
    每条数据都加时间,如果有重叠,就用最新的时间。
    你只能相信时间(手机的时间基本是准的),其他设备你自己分析。
    cmdOptionKana
        2
    cmdOptionKana  
       2020-03-15 20:20:41 +08:00
    必然会遇到有冲突的时候,就看遇到冲突时怎么优雅地处理了。
    refresh
        3
    refresh  
    OP
       2020-03-15 20:20:50 +08:00
    @loading 时间的方式不太靠谱,因为用户可能会改时间,当然多数的情况下是对的
    refresh
        4
    refresh  
    OP
       2020-03-15 20:21:19 +08:00
    @cmdOptionKana 有办法不冲突吗,如果冲突,可能就只有提醒用户选择如何覆盖了,但我希望这个过程是完全自动的
    cmdOptionKana
        5
    cmdOptionKana  
       2020-03-15 20:27:53 +08:00
    @refresh 不可能,多终端肯定会冲突。除非……

    除非要求必须先联网同步,不同步不让编辑。(但这会影响用户体验)
    aricxu
        6
    aricxu  
       2020-03-15 20:30:32 +08:00
    版本控制,类似 svn,git 那样搞
    Kilerd
        7
    Kilerd  
       2020-03-16 00:03:37 +08:00   ❤️ 1
    CRDT 算法了解一下。
    如果是文本的话,还可以考虑用 ot 和 easysync 算法
    Tink
        8
    Tink  
       2020-03-16 00:07:56 +08:00 via iPhone
    冲突的时候复制副本,让用户选
    luckyrayyy
        9
    luckyrayyy  
       2020-03-16 02:40:40 +08:00
    都改一个地方怎么可能不冲突?除非预设冲突解决方案,比如一切以最新的为准。
    Mithril
        10
    Mithril  
       2020-03-16 09:29:28 +08:00
    要么像 SVN 一样,编辑以前连一下服务器加锁。
    要么像 Git 一样,想办法自己解决冲突。
    虽然有各种自动合并的算法,但终究是会有冲突的。出现冲突只能让用户解决,没有别的办法。
    passerbytiny
        11
    passerbytiny  
       2020-03-16 09:43:25 +08:00
    多方同时更改一个东西,必然冲突;冲突必然需要手动处理:这两个基本原则你是永远无法违反的,不管离线还是在线(在线的时候可以加锁从而避免同时更改一个东西,但如果锁处理的不好照样冲突)。

    这里面唯一的漏洞是:一份数据并不总是一个整体,它可以拆分成多个数据块。这样虽然表面看起来是多方共同更改一份数据,但实际上是各自更改各自的专有数据,从而可以协同工作。

    所以你可以试者对数据做分配,让不同的客户端修改不同区域的数据。然而协同工作这种事,单个或者几十个程序员就不要自己搞了,老老实实买吧。光文件同步这一个东西,微软就做了好多年、买了几家小公司、砍了无数半成品,才做出 SkyDrive。
    refresh
        12
    refresh  
    OP
       2020-03-16 10:47:14 +08:00
    @luckyrayyy 如何判断哪个数据是新的?客户端和服务器端的时间可能不一致,如果多端同时修改的话,无法判断。
    @Tink 嗯,如果没有办法,只能用这个了
    @Mithril 操作的时候,可能是离线的
    @passerbytiny 我的这个协同工作主要是操作数据库,并不是文件操作。可以认为一个用户的数据有无数行,在离线的时候,任何用户都可能修改其中的一条数据(包括 update 和 insert,delete 不做物理删除,所以也是 update ),当连线的时候,如何确保一致性。
    passerbytiny
        13
    passerbytiny  
       2020-03-16 11:07:53 +08:00
    @refresh #10 不要搞了。关系数据库同步别说离线同步了,就是在线同步,也没人敢干。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3483 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 11:16 · PVG 19:16 · LAX 03:16 · JFK 06:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.