【实战篇】社交推荐系统技术栈:从协同过滤到实时推荐

0 阅读5分钟

这篇文章是我亲身经历的一个语音社交App项目的架构演进过程。从MVP验证到支撑百万用户,每一步都踩过坑、做过取舍。希望这些真实经验能帮到正在做类似项目的你。

一、项目背景

1.1 产品定位

· 产品类型: 语音社交App

· 核心功能: 语音聊天室、即时通讯、社交关系链

· 目标用户: 18-35岁年轻人

· 商业模式: 虚拟礼物打赏、会员订阅

1.2 业务指标

阶段DAU目标并发峰值
MVP验证期1万500
增长期10万5000
成熟期100万50000

二、阶段一:MVP验证期(0-3个月)

2.1 架构目标

· 快速上线验证产品假设

· 支撑1万DAU

· 最小可行架构

2.2 技术选型

组件选型理由
后端框架Springboot开发效率高
IM SDK融云快速接入,消息可靠
RTC SDK声网音质好,弱网抗性强
数据库MySQL熟悉,够用
缓存Redis必须的
消息队列单机不需要

2.3 架构图

架构图

2.4 踩过的坑

坑一:IM消息状态和RTC状态分裂

用户显示在房间里,但音频没连上。原因:IM加入成功,但RTC加入失败,两边状态不同步。

解决方案: 引入状态协调器,IM加入成功后等待RTC确认,超时则回滚。

坑二:礼物高并发导致数据库压力

某次活动,瞬间几万人送礼物,数据库连接池被打满。

解决方案: 礼物发送走Redis扣款,异步写数据库。

三、阶段二:增长期(3-9个月)

3.1 架构目标

· 支撑10万DAU

· 服务拆分,独立扩容

· 提升可用性

3.2 服务拆分

单体服务拆分为:

  1. 用户服务:用户注册、登录、资料
  2. 房间服务:房间管理、成员管理
  3. 消息服务:消息收发、历史存储
  4. 礼物服务:礼物发送、账户管理
  5. 推荐服务:好友推荐、房间推荐
  6. 通知服务:推送、通知

3.3 技术升级

升级点原方案新方案
消息队列RabbitMQ
服务发现硬编码IPNacos
配置中心配置文件Nacos
网关NginxSpring Cloud Gateway
监控Prometheus + Grafana
日志文件ELK

3.4 架构图

在这里插入图片描述

3.5 踩过的坑

坑一:服务雪崩

用户服务响应慢,拖垮了房间服务、礼物服务。

解决方案: 引入熔断器(Sentinel),服务降级。

坑二:分库分表后跨库查询

按用户ID分表后,查询「某房间所有用户」需要跨库。

解决方案: 冗余存储。房间成员表独立,不分库。


四、阶段三:成熟期(9-18个月)

4.1 架构目标

· 支撑100万DAU

· 高可用(99.9%)

· 多机房部署

4.2 技术升级

升级点说明
消息队列RabbitMQ → Kafka(更高吞吐)
服务网格引入Istio
多机房北京、上海双机房
IM自研核心IM自研,第三方备份
监控全链路追踪(Jaeger)

4.3 多机房架构

用户请求

└── DNS解析 → 就近机房

├── 北京机房
│ ├── 用户服务集群
│ ├── 房间服务集群
│ └── Redis集群(主)

└── 上海机房
├── 用户服务集群
├── 房间服务集群
└── Redis集群(从)

4.4 踩过的坑

坑一:跨机房延迟

用户在北京,房间数据在上海,延迟50ms+。

解决方案: 房间数据按创建者所在地就近存储,跨机房访问走专线。

坑二:自研IM的坑

自研IM投入大,初期问题多,消息丢失率一度达到0.5%。

解决方案: 自研IM先用于非核心场景,核心流量继续走第三方,逐步迁移。

五、核心数据对比

5.1 架构指标

指标MVP期增长期成熟期
DAU1万10万100万
服务数量1615+
数据库实例2832
Redis实例2416
消息延迟200ms100ms50ms
可用性99%99.5%99.9%

5.2 团队规模

阶段后端团队运维团队
MVP期3人1人
增长期8人2人
成熟期20人5人

六、经验总结

6.1 架构原则

原则说明
先跑通再优化MVP阶段不要过度设计
按需拆分服务拆分有成本,不是越细越好
第三方先行非核心能力先找第三方,成熟再自研
监控先行没有监控的系统是盲人摸象
预留扩展性设计时考虑未来1-2年的扩展

6.2 技术债务管理

阶段技术债策略
MVP期允许技术债,快速验证
增长期开始还债,重构热点模块
成熟期持续还债,建立规范

七、给创业团队的建议

  1. 不要一开始就搞微服务,单体够用时单体最好

  2. 第三方SDK能省很多时间,把精力放在业务上

  3. 监控告警比功能开发重要,出了问题要第一时间知道

  4. 压测要提前做,不要等用户来了才发现扛不住

  5. 预留3倍容量,流量突增时才有缓冲


下篇预告: 《从1万到100万DAU架构经历了哪些变化》——更详细地拆解每个阶段的架构变化。

持续输出社交App开发实战经验,关注我,一起成长。