转自CSDN,5年前写的第一篇技术类的文章,当时还是个小菜鸟,一转眼5年过去了
当时从知乎摘抄的别人的励志故事,激励工作不久略失意的自己(工作缺少激情),开始利用下班时间自学android开发、iOS开发、Python开发。。。
职业方向有点迷茫,就都在学。
幸运的是,公司下班较早5点多就下班了,租住在人大附近,一下班就蹭人大的自习室学习,有时蹭女友的图书馆卡去借书看。
那段日子还是挺充实的,想想现在,基本没有自己的时间,唉。。。
当时做离线逻辑时的想法
https://blog.csdn.net/webgeek/article/details/17124159
----------------------------------------------------------------------说正事分割线------------------------------------------------------------------------------------
昨天公司开发图书应用的同事们,在讨论多端离线操作,协同同步的问题。
记得在上家公司,曾经遇到类似的问题:自己当时做过几个月的数据清洗工作,因为服务器资源稀缺,自己也比较懒,常常会写n多行的sql脚本,再一起运行,在运行之前要先人工检查是否有可能conflict发生。如此便有了思路:大脑的人工思维过程用算法表示出来就是了。。
思路如下:
场景搭建:
1,A手机在6点进行了5次离线操作(增删改 whatever)
2,B手机在7点进行了5次离线操作(增删改 whatever)
3,A手机又在8点进行了5次离线操作(增删改 whatever)
4,C手机在9点进行了5次离线操作(增删改 whatever)
其实还可以往下持续的写,某个菜鸟土豪有n多移动终端在n多时间点进行n多离线操作,埋了n多个遥控bomb(一个终端对应一个),之后的引线便是online操作
条件假设:
1,每个手机上该应用,在进行离线操作时,都会把 每一次操作记录下来,并标记flag,例如 添加flag为1,删除flag为-1,修改flag为0,对于查找请直接无视吧(解决local conflict)
解决local conflict:
每次操作语句(特殊加工之后)都记录下来(select操作可以不计入)到本地operQueue表(操作名,对象名,对象ID.....),每添加一条都与表中对比(根据 对比选择是继续添加,还是拒绝,暂时不考虑 覆盖吧,虽然可以时间但比较麻烦点),对比显然是关键,如果是insert操作基本可以无视,但如果是插入的对象在operQueue中的对象ID中存在就拒绝,不存在就放行;如果是delete操作,如果ID存在,那么就覆盖原先(这里可以提醒土豪,让他选择),无 则放行,update操作基本放行,除了发现有相同ID的delete操作,那么就拒绝。当然还有一个关键是,当同步后清空本地表。
2,服务器数据库中添加字段flag(默认为空),和timestamp,同步 添加flag为1,同步 删除flag为-1,同步 修改flag为0(解决多终端conflict)关键是我们不删除而是标记删除符号。
解决多终端conflict:
离线同步都会记录下来,神马操作flag也会计入
conflict vs hexie
1)某个手机delete了,另一个离线操作还有update
2)某个手机delete了,另一个离线操作还有delete
3)某个手机insert了,另一个还有insert
因为我们的删除不是真的删除,找到带有删除flag的,就提醒用户该记录已被另一部终端给删除了,所以上面的conflict都能很容易解决是否接受或拒绝其他终端的离线同步操作
高潮来了:
1,在9:30,土豪用C手机online登录,然后又用B手机登录,又用A登录
联网事件触发。。。。。。。还有修改android bug 暂时不写了