V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
thinkm
V2EX  ›  程序员

请教一个数据同步的方案。

  •  
  •   thinkm · 2023-03-21 21:27:06 +08:00 · 1012 次点击
    这是一个创建于 373 天前的主题,其中的信息可能已经有所发展或是发生改变。

    小弟我程序员菜鸟,请教各位一个数据同步的问题,APP(采用 flutter)与服务端(nodejs)进行数据同步。

    大概就像是 Iphone 的 iCloud 功能,比如拍了一张照片,会穿上到 icloud ,删除照片,也会从 icould 上面删除,换手机后,也能直接同步到新手机。

    看起来挺简单的,小弟我一细想就觉得有点复杂,例如没网的时候用户操作了怎么办,或者是网络差,文件上传到一半断网了怎么办...,怕我代码写的不好,莫名其妙把用户的文件从云端误删了...

    用户的文件主要是音频文件(10MB 左右) 请问各位知道有现成的成熟库可以直接用吗?或者是给小弟提供一点思路,感激不尽

    7 条回复    2023-03-24 10:33:58 +08:00
    star7th
        1
    star7th  
       2023-03-22 09:02:22 +08:00
    1 ,记录时间戳,确保哪一个是最新的动作
    2 ,完整性校验,校验通过的才是操作完成,其他都是失败。不管是不是上传到一半。
    3 ,回收站机制,文件删除先进回收站。
    thinkm
        2
    thinkm  
    OP
       2023-03-22 09:55:55 +08:00
    @star7th 谢谢老哥,有一个疑问,记录时间戳是针对动作还是文件?
    star7th
        3
    star7th  
       2023-03-22 09:56:51 +08:00
    @thinkm 肯定都要记录。然后自己根据实际情况比较。
    thinkm
        4
    thinkm  
    OP
       2023-03-22 09:58:53 +08:00
    @star7th 还是老哥靠谱啊,问了 chatgpt 给不出具体的代码
    shellus
        5
    shellus  
       2023-03-24 10:19:34 +08:00
    1:新增文件 -》 无:创建;有,相同:忽略;有,不同:覆盖
    shellus
        6
    shellus  
       2023-03-24 10:26:34 +08:00
    客户端视角-》云端视角:
    1:新增文件 -》 无:创建;有,相同:忽略;有,不同:覆盖
    2:更新文件(上版本 hash+更新内容)-》如果上版本 hash 等于云端现有内容,那么是正常的从 1 到 2 的更新,通过。如果上版本 hash 不等于云端现有内容,说明客户端在此次更新前,对于该文件与云端持有不同版本,那么就要形成冲突差异文件并提示用户选择。
    shellus
        7
    shellus  
       2023-03-24 10:33:58 +08:00   ❤️ 1
    我们假设有 A 和 B 两个用户,他们对一个现有空白 a.txt 的编辑操作,按照时间顺序是:
    A:写入 1
    B:写入 2
    A:写入 3
    B:写入 4
    一共 4 次操作,我们假设服务端会在任意时间接收到这 4 次更新(因为客户端离线编辑,联网后上传,所以顺序是不固定的)
    我们假设服务器先收到第 4 个操作,那么服务端直接将 4 写入 a.txt
    接着,第 3 个操作来了,我们用 3 覆盖掉了 4 就是丢了最新数据,造成了事故

    所以,每次要不要更新,就是要带上更新前的 hash ,让各方达成共识,如果第三个的操作描述是:将 2 改成 3 。那么服务端在收到这条信息的时候就会检查现在是不是 2 ,不是 3 的话,“将 2 改成 3” 这个操作就会被拒绝
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   966 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:47 · PVG 04:47 · LAX 13:47 · JFK 16:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.