本文档详细介绍了社交网络图谱服务设计的技术实现。它重点关注高效存储和查询用户之间社交关系所需的数据结构和算法,并特别强调在大规模社交网络中查找用户间最短路径。
该设计解决了扩展社交图谱系统以处理1亿用户(平均每位用户50个朋友,共约50亿朋友关系)所面临的挑战。
来源: solutions/system_design/social_graph/README.md1-33
我们的主要用例是允许用户搜索另一个用户,并查看与被搜索者之间的最短路径(例如,显示用户如何通过共同朋友连接起来)。
即使图数据无法在单台机器上存储,并且流量模式不均匀,该服务也必须保持高可用性。
来源: solutions/system_design/social_graph/README.md15-47
高级架构图
该系统包含以下关键组件
来源: solutions/system_design/social_graph/README.md52-54 solutions/system_design/social_graph/README.md102-113
人员数据模型
Person 类是社交网络中表示用户的基本数据结构。每个用户都拥有
来源: solutions/system_design/social_graph/README.md154-161 solutions/system_design/social_graph/social_graph_snippets.py31-36
查找服务维护着人员ID与存储该用户数据的“人员服务器”之间的映射。该服务通过允许我们将用户数据分片到多个服务器来支持我们系统的分布式特性。
这项服务对于处理无法在单台机器上容纳的图数据至关重要。
来源: solutions/system_design/social_graph/README.md119-131 solutions/system_design/social_graph/social_graph_snippets.py39-46
人员服务器存储实际的用户数据。每个服务器负责一部分用户数据,这由分片策略决定。
来源: solutions/system_design/social_graph/README.md133-150 solutions/system_design/social_graph/social_graph_snippets.py49-59
用户图谱服务是实现社交图谱遍历算法的核心组件。它使用广度优先搜索(BFS)来查找两个用户之间的最短路径。
BFS算法流程
用户图谱服务的核心实现
BFS算法的工作原理是
这种方法保证能找到两个用户之间的最短路径(最少跳数)。
来源: solutions/system_design/social_graph/README.md163-219 solutions/system_design/social_graph/social_graph_snippets.py62-72 solutions/system_design/social_graph/README.md63-100
该系统为客户端应用程序公开了一个RESTful API
GET /api/v1/friend_search?person_id=1234
响应示例
响应包含连接请求者与目标用户的路径,显示了连接链。
服务之间的内部通信使用远程过程调用(RPC)而非REST。
来源: solutions/system_design/social_graph/README.md221-247
扩展架构图
为应对平均每秒400次请求(并在高峰期处理更高负载),我们实施了多种扩展策略
来源: solutions/system_design/social_graph/README.md249-286
多项优化可以提升我们社交图谱系统的性能
| 优化 | 描述 | 优点 |
|---|---|---|
| 内存缓存 | 存储完整/部分BFS遍历结果 | 加速后续查找 |
| 离线计算 | 预计算常见搜索的路径 | 减少按需计算 |
| 批量朋友查找 | 在同一“人员服务器”上分组朋友查找 | 减少网络跳转 |
| 基于地理位置的分片 | 按位置对用户进行分片 | 提高数据访问的局部性 |
| 双向BFS | 从源点和目标点同时搜索 | 可显著缩小搜索空间 |
| 高连接度节点优先级 | 从拥有大量连接的用户开始 | 通常更快地缩短路径长度 |
| 搜索限制 | 按时间或跳数限制搜索 | 防止资源过度使用 |
来源: solutions/system_design/social_graph/README.md273-286
对于一个生产就绪的社交图谱系统,应考虑以下额外因素
缓存策略:
数据库设计:
异步处理:
安全考量:
来源: solutions/system_design/social_graph/README.md287-349
该设计提供了一种可扩展的方法来实现社交图谱服务,能够处理1亿用户和50亿朋友关系。核心组件(用户图谱服务、查找服务和人员服务器)协同工作,以支持用户之间高效的路径查找。
通过实施上述优化技术,系统即使在高峰负载条件下也能保持高性能和高可用性。该设计遵循模块化架构,允许根据需要独立扩展不同组件。