系统架构 - 完整的通知系统

三个月的成长

不知不觉,我在”圈内”已经三个月了。

回想第一天接手通知系统时的问题:

  • 推送延迟 5-10 秒
  • 重复推送
  • 半夜打扰用户
  • 没有偏好设置

现在,这些问题都已经解决了。

完整架构

我画了一张完整的系统架构图:

┌─────────────────────────────────────────────────────────────────┐
│                          业务层                                 │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐      │
│  │ 评论服务 │  │ 点赞服务 │  │ 关注服务 │  │ 私信服务 │      │
│  └─────┬────┘  └─────┬────┘  └─────┬────┘  └─────┬────┘      │
│        └──────────────┴──────────────┴──────────────┘            │
└──────────────────────────────┼───────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│                        通知服务层                               │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │                   通知调度服务                            │  │
│  │  - 接收业务事件 / 检查用户偏好 / 限流检查 / 消息聚合     │  │
│  └───────────────────────┬──────────────────────────────────┘  │
│              ┌───────────┴───────────┐                         │
│              ▼                       ▼                         │
│  ┌──────────────────┐    ┌──────────────────┐                │
│  │   推送服务       │    │   站内信服务     │                │
│  │  - APNs/厂商推送 │    │  - 消息存储/查询 │                │
│  └──────────────────┘    └──────────────────┘                │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐      │
│  │  MySQL   │  │  Redis   │  │ RabbitMQ │  │   ES     │      │
│  │ 消息存储 │  │ 缓存/限流│  │ 消息队列 │  │ 日志搜索 │      │
│  └──────────┘  └──────────┘  └──────────┘  └──────────┘      │
└─────────────────────────────────────────────────────────────────┘

关键技术决策

1. 消息队列:RabbitMQ

支持延迟队列、消息确认、优先级队列

2. 缓存:Redis

用户偏好缓存、未读计数、推送限流、分布式锁

3. 数据库:MySQL 分表

站内信表按用户 ID 分 16 张表

高可用设计

  • 服务降级:推送服务不可用时,只发站内信
  • 消息重试:推送失败自动重试 3 次
  • 监控告警:延迟、成功率、投诉监控

性能优化

  • 批量操作:批量创建站内信
  • 异步处理:Celery 异步发送推送
  • 连接池:HTTP 连接复用

关键指标

指标优化前优化后
推送延迟5-10 秒< 1 秒
推送成功率85%95%
重复推送率5%< 0.1%
系统可用性95%99.9%

经验总结

  1. 理解业务场景:平衡及时性和打扰度
  2. 分层设计:业务层、服务层、数据层独立演进
  3. 用户控制:让用户自己控制通知偏好
  4. 监控驱动:没有监控就是盲人摸象

技术栈

  • 后端:Python / PHP
  • 消息队列:RabbitMQ
  • 缓存:Redis
  • 数据库:MySQL(分表)
  • 监控:Prometheus + Grafana
  • 推送:极光推送 / 自建推送
  • 任务队列:Celery

通知系统看起来简单,但要做到及时、可靠、不打扰,需要深入理解业务,精心设计架构。希望这门课程能帮助你设计出自己的通知系统!