本地数据库和聊天应用程序中新消息的同步

Local DB and syncing of new messages in a chatting app

谈到这个话题,我有点手足无措。这是我的情况,我有一个类似不和谐风格的应用程序,您可以在其中加入聊天室。我现在遇到了如何结合远程数据库处理和使用本地数据库的问题。因为我只会加载当前数据库的最新 X 消息,然后如果用户滚动获取其他 X 等等。但是本地数据库在哪里出现呢?例如,我从上午 10 点到凌晨 12 点存储在数据库消息中,我是否应该从本地数据库获取最旧的消息并在请求数据时跳过远程数据库中的时间范围?如果有人删除/编辑了消息怎么办?从我目前的角度来看,似乎只有一个远程数据库才是可行的方法

服务器使用 Nodejs Typescript 和 MongoDB,客户端是 Kotlin 多平台应用程序,如有必要,我可以访问客户端上的 SQL 数据库。

无论如何我都会处理这个问题,因为这是一个聊天应用程序并且我已经建立了 Websocket 连接,加载消息并通过 Websocket 接收它们是否有意义,或者我应该制作一个 REST 端点?

你的 localdb 实际上是一个缓存,你应该这样对待它。现在有了缓存,还有另一个问题,缓存失效。更糟糕的是,由于每个客户端都有自己的客户端,因此存在分布式缓存失效问题。

您可能可以通过使消息不可变并拥有一个 REPLACES_ID 和一个 IS_DELETED 字段来回避很多这样的事情,这允许“编辑”实际上是一个添加,然后从 UI standpoint 替换了另一个现有消息。这至少会给你一些从游标角度来看相当可计算的东西。

理想情况下,您的 ID 字段是一个递增的数字序列,允许简单的查询,例如“给我 X 个来自 ID 大于 [[缓存中的最后一个 ID]] 的房间的消息”如果没有返回数据,您的本地数据库拥有所有数据,否则从查询中获取数据并填充本地数据库以引入这些消息。

滚动比较复杂,但一般可以忽略,没有人滚动(统计无关人数去第2页)。我建议,如果有人滚动,只需擦除第一页之后的本地数据库,然后返回到远程服务器以获取当前页面第一条记录之前的 X 条记录。