如何对聊天应用程序的实时数据库进行数据分片?

Tom*_*652 4 sharding firebase firebase-realtime-database

我正在构建一个聊天应用程序并想要使用实时数据库。我希望我的数据库能够达到 200k 并发连接配额。

所以我阅读了有关扩展和分片数据的文档。

但是我不明白如何处理聊天应用程序。假设我有一个groups引用,其中包含每个组内用户的 ID 以及该组的消息。

如果我想扩展,我需要创建一个新的数据库实例并开始在那里写入组,因为第一个数据库可能有超过 200k 的同时连接。

这意味着用户可能属于groups多个数据库,这看起来已经很奇怪而且不是一个好主意。

所以我想知道:

  • 我如何分割groups参考?
  • 我怎样才能(或者甚至应该)让用户根据groups他们所属的情况连接到多个数据库?

这似乎是一种非常复杂的做事方式......我理解得不正确吗?

Dha*_*raj 5

我确信有很多方法可以对数据库进行分片,但我是这样做的。这涉及在创建新聊天时选择一个分片。对于这个答案,我们假设有 4 个用户:U1、U2、U3 和 U4,以及 2 个分片(不包括默认分片):shard1 和 shard2。

每当用户创建新聊天时,选择一个分片并为该聊天创建一个新节点。您应该将用户的聊天列表与分片 ID 一起存储在其他地方,默认数据库实例似乎非常适合此操作,但 Firestore 也可以。因此,包含聊天信息的对象将类似于:

{
  chatID: "c40f15af19a94b6f84117747337b9f7a",
  createdBy: "U1",
  users: ["U1", "U2", "U3"],
  shardId: "shard2"
}
Run Code Online (Sandbox Code Playgroud)

现在您已经有了 chatID 及其分片的列表,因此只需连接您的听众即可。同样,这取决于预期的行为是什么。就我而言,我只需要监听用户选择的数据(即主动聊天)。

尝试将聊天均匀地分配到所有分片上。活跃聊天量最少的一种(您必须将每个分片创建的聊天数量存储在其他地方,例如默认分片)(或者诸如循环法之类的东西可能有用。同时,考虑创建聊天的用户。

在此输入图像描述

创建新聊天时增加分片中存在的聊天数量可能是一个好方法。

最后,我认为这只是关于如何将聊天划分为碎片,并且您可以使用许多算法。如上所述,拥有包含分片名称的用户聊天列表似乎是一种简单的方法。我个人更喜欢 Firestore 存储聊天列表,这样可以更轻松地根据聊天创建者、用户 U2 参与的聊天等进行查询。

首选使用云功能(或您的服务器)创建新的聊天,因此没有人可以通过对应用程序进行逆向工程来向单个数据库碎片发送垃圾邮件。

这样,您的所有消息都将存储在实时数据库中,但聊天的基本信息将存储在 Firestore 中(不是必需的,但更容易查询聊天)。当用户打开聊天应用程序时,加载他们所属的聊天:

以下是 Firestore 文档示例:

在此输入图像描述

{
  chatID: "c40f15af19a94b6f84117747337b9f7a",
  createdBy: "U1",
  users: ["U1", "U2", "U3"],
  shardId: "shard2"
}
Run Code Online (Sandbox Code Playgroud)

您不需要加载所有聊天记录,如我上面所示。仅加载活动聊天的消息。