本章将会设计一个通知系统。 通知不仅仅包含推送通知,通知的三种形式为:
- 推送通知
 - SMS通知
 - 邮件通知
 
第一步 理解问题,确定设计范围
本例的设计需求:
- 支持上述三种通知
 - 软实时,用户尽快收到通知。但高负载下可接受轻微延迟
 - 支持设备:ios,android,laptop,pc
 - 客户端和服务端均可触发通知
 - 用户可自主设置是否关闭通知
 - 通知的数量:每天10million推送,1million SMS消息,5million邮件
 
第二步 high-level设计
- 不同通知类型需要的组件
- iOS
- provider提供以下数据
- device token
 - payload
 
 - APNs
 - device
 
 - provider提供以下数据
 - Android
- 与上述类似,替换FCM
 
 - SMS消息
- 第三方的SMS服务例如Twilio,Nexmo
 
 - Email
- Sendgrid,Mailchimp等商业服务
 
 
 - iOS
 - 联系方式收集工作流
- 用户安装或首次登录时记录数据到DB
 - 用户与设备可能是一对多
 
 - 通知发送/接收工作流
- Service 1 to N
 - 通知系统
 - 第三方服务
 - 客户端设备
 
 
存在的一些改进点
- SPOF
 - 单个通知服务器难以扩展
 - 性能瓶颈
 
改进
- 将数据库、缓存移出通知服务器
 - 增加通知服务器,水平扩展
 - 引入消息队列,解耦
 
改进后的工作流:
- Service 1 to N
 - 通知系统
 - 缓存
 - DB
 - MQ
 - workers
 - 第三方服务
 - 客户端设备
 
第三步 design deep dive
- 可靠性
- 如何防止数据丢失:持久化
 - 接收者是否会准确地收到一次通知:分布式的特性会导致重复,引入去重复机制减少重复发生率
 
 - 额外的组件以及考虑点
- 通知模板
 - 通知设置
 - 限流
 - 重试机制
 - 安全性
 - 监控队列通知
 - 事件追踪
 
 
第四步 总结
整理并回顾下上述的内容。