程序想要支持离线使用?应该怎么实现云端实时同步?

2023-09-11 10:17:24 +08:00
 zyxk
程序想要支持离线使用?应该怎么实现相关技术?

比如一个最简单的单人记账软件,想要实现云端实时同步,客户端离线时时也可以使用全功能,

我是这样想的,软件使用本地数据库 Sqlite 实现全部功能,每个表都要增加一个时间检验,

因为网页端可能修改数据,客户端离线时也可能修改了数据,

所以每次客户端启动时逐行判断检验字段实现同步数据,(数据量少时可以,数据量大的软件怎么实现呢)

之后客户端正常在线,WebSocket 连接服务器,添加或更新数据后,ws 通知服务端更新?

但是感觉这样实现后不太严谨?请问这种需要应该怎么实现?请教各位
2982 次点击
所在节点    程序员
26 条回复
butanediol2d
2023-09-11 19:54:06 +08:00
@NUT #20 CRDT 不就是没有冲突吗?
XiLingHost
2023-09-11 23:57:13 +08:00
直接用文本存储+git 版本控制得了
AItsuki
2023-09-12 02:27:46 +08:00
这种应用实现难度在前端而不是后端,前端要设计复刻一套后端的业务逻辑,然后进行同步表。
同步的逻辑基本都是前端处理,后端只做数据版本校验(类似乐观锁的那种版本),符合规则的就入库。如果多设备同步出现冲突,简单的方案是谁先同步谁胜出。总的来说还是比较复杂的,所以我更推荐的是实时数据库。

例如 realm ,couchdb 等。或者使用云服务,例如 google 的 firebase 的实时数据库,aws 和 azure 我记得也有,忘了叫啥。
shenyuzhi
2023-09-12 12:04:43 +08:00
最大的坑在于冲突了怎么办。
如果需要解决冲突,这个问题会非常复杂。
如果不需要解决冲突,那就简单了,根本不需要自己写服务器端程序,直接对接各种云存储就行了。本地用 sqlite ,每隔一段时间备份到云存储。
SenLief
2023-09-12 17:29:26 +08:00
同步的解决要远大于记账类软件的开发的。最难得问题就是冲突如何处理?多端同步如何识别相同的内容?
NUT
2023-09-14 18:32:13 +08:00
@butanediol2d CRDT 是用最大可能进行处理冲突。 而不是没有冲突。 可以查一下。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/972638

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX