【问题标题】:Local DB and syncing of new messages in a chatting app本地数据库和在聊天应用程序中同步新消息
【发布时间】:2021-11-22 05:02:45
【问题描述】:

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

使用 Nodejs Typescript 和 MongoDB 作为服务器和客户端是 Kotlin 多平台应用程序,如果需要,我可以访问客户端上的 SQL DB。

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

【问题讨论】:

    标签: node.js mongodb database-design architecture chat


    【解决方案1】:

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

    您可以通过使消息不可变并拥有一个 REPLACES_ID 和一个 IS_DELETED 字段来避免很多这种情况,从而允许“编辑”真正成为一个添加,然后从 UI 的角度替换另一个现有消息。这将在从光标的角度来看,至少给你一些相当可计算的东西。

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

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

    【讨论】:

    • 暂时将 LocalDB 放在次要位置,目前似乎不是 100% 值得或不需要。感谢您的答复。如果其他人提供他们的意见并接受您的回答,将等待
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多