Tinder System Design
设计一个支持 5 亿总用户、5000 万日活跃用户(DAU)的约会匹配系统。该系统的核心挑战在于结合高并发地理位置检索(LBS)与极低延迟的实时双向滑动匹配。
1. 核心业务与高可用指标
- 基本功能:
- 用户 Profile 维护:包含用户的基本属性、兴趣、照片以及关键的经纬度(Latitude/Longitude)。
- 地理位置发现(Recommendation):根据用户的地理筛选范围及偏好,在毫秒级内返回附近未看过的推荐 Profile。
- 滑动判定(Swipe):记录用户的“左滑(Pass)”和“右滑(Like)”。
- 实时匹配通知(Match & Notification):若两名用户互相同意(右滑),立即触发 Match 通知双方。
- 非功能性指标:
- 低延迟:推荐列表加载时间需在 200 毫秒以内。
- 高吞吐量:支持 5000 万 DAU 下的高频滑动数据持久化。
- 高可用性:系统服务需达到 99.99% 以上的可用性。
2. 关键系统架构与优化
地理位置索引 (Geohash / Quadtree)
- 挑战:传统数据库在海量经纬度下进行二维空间范围查询(如“寻找附近 10 公里的用户”)极其缓慢。
- 解法:引入 Geohash 或 四叉树(Quadtree) 机制。
- 将地球表面划分为网格,并将二维的经纬度数据压缩编码为一维的哈希字符串。
- 这使得空间范围查询可以退化为数据库中对一维 Geohash 编码的前缀或范围检索(Range Query),极大地提升了附近人查询的响应速度。
推荐去重与防重推荐 (Redis Bloom Filter)
- 挑战:避免向用户重复推荐其已经左滑(Pass)或右滑(Like)过的 Profile。
- 解法:在推荐服务前置引入 Redis 布隆过滤器(Bloom Filter) 或维护一个以
user_id为 Key 的已阅集合(Read Set)。- 当加载推荐列表时,将候选人列表在缓存中快速做差集过滤,筛掉所有已被该用户滑过的人,保证推荐池的新鲜度。
实时双向滑动匹配与异步解耦
- 匹配工作流 (Match Workflow):
- 滑动事件写入:当用户 A 右滑用户 B 时,请求进入 Match Service。
- 双向判定:服务在 Key-Value 缓存(如 Redis)中快速查询是否存在“B 已经右滑 A”的反向记录。
- 消息队列削峰:如果发生双向右滑(Like Match),不直接进行同步 of DB 读写,而是将 Match 事件推入消息队列(如 Kafka)。
- 异步消费与推送:
- Match Worker:消费队列事件,在 Match 数据库中插入一条匹配记录。
- WebSocket / Server-Sent Events (SSE):长连接通知网关消费事件,立即向在线的双方用户推送匹配成功的实时系统通知。
Source: 2026-06-28-xiaohongshu-xhslink-com-o-1yYuoBQrRFH(来源未公开)