N 个客户端都存在离线写入数据的情况下,如何在同步的时候确定始终最新且不出错? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
refresh
V2EX    问与答

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

  •  
  •   refresh 2020-03-15 20:14:58 +08:00 2760 次点击
    这是一个创建于 2036 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在有 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  
    PRO
       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 不要搞了。关系数据库同步别说离线同步了,就是在线同步,也没人敢干。
    /div>
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2653 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 02:22 PVG 10:22 LAX 19:22 JFK 22:22
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86