一个 1.6GB 的完整社交网络(GraphD 第 2 部分)

主要观点:

  • 在 Bluesky 社交网络中,探讨如何更高效地处理用户关注关系数据,从使用 HashMaps 和 HashSets 到引入 Roaring Bitmaps。
  • 介绍了位图(bitmap)的概念,包括普通位图和用于压缩的 Roaring Bitmaps。
  • 展示了如何用 Go 语言实现基于 Roaring Bitmaps 的 GraphD 服务,用于跟踪用户的关注关系和进行集合操作。
  • 比较了使用 Roaring Bitmaps 前后在内存占用、磁盘存储、启动时间、吞吐量和延迟等方面的优化效果。
  • 提及下一步可能使用 DGraph 的内存序列化 Roaring Bitmap 库来进一步优化。

关键信息:

  • 在 Bluesky 有百万用户和数亿关注关系,原用 in-memory 图存储处理“谁关注了用户 B 且被用户 B 关注”问题。
  • 位图是存储整数集合的一位值向量,可节省空间,如用 10,000 位位图记录 10,000 用户的邮件验证状态。
  • 处理社交网络问题时,简单位图存储大量用户关注关系需大量空间,如存储“关注用户 A 的人”需约 687KB 空间,同时存储“用户 A 关注的人”则需约 1.37MB 空间。
  • Roaring Bitmaps 按 2^16 整数分块存储,稀疏块用排序数组,密集块用位图,能支持密集和稀疏数据,并行操作高效。
  • GraphD 用 FollowMap 结构跟踪用户关注关系,添加关注只需设置相应位图位,计算交集可并行处理。
  • 用 Roaring Bitmaps 可将 6.5GB 内存中的图序列化到约 1.6GB 的 SQLite 数据库中,加载只需约 20 秒,每秒可处理 70k 请求,且同步数据到磁盘速度快。

重要细节:

  • Part 1介绍了 in-memory 图存储,收到用 Roaring Bitmaps 改进的反馈。
  • 详细说明了 Run Length Encoding (RLE)的压缩策略及缺点。
  • 给出了 GraphD 中添加关注和计算交集的代码示例,展示了 Roaring Bitmaps 的使用方式。
  • 对比了使用 Roaring Bitmaps 前后在各种性能指标上的变化数据,如内存减少约 20%、磁盘大小减少约 84%等。
  • 提到下一步可能使用 DGraph 的相关库来进一步优化。
阅读 16
0 条评论