Notification System设计
2025-5-30
| 2025-5-30
0  |  Read Time 0 min
type
status
date
slug
summary
tags
category
icon
password
有三种类型的notification sys
notion image
 
push sms email
 
一般透过3rd party services
notion image
 
 
 
notion image
Notification servers: They provide the following functionalities:
• Provide APIs for services to send notifications. Those APIs are only accessible internally or by verified clients to prevent spams. • Carry out basic validations to verify emails, phone numbers, etc. • Query the database or cache to fetch data needed to render a notification. • Put notification data to message queues for parallel processing.
 
 
 

Reliablity:

 

data loss:

notion image
 
 
 

receive a notification once?

完全正确!Event ID是解决"恰好一次"问题的核心概念。

什么是Event ID?

Event ID就是事件的全局唯一标识符,它确保:
  • 同一个业务事件,无论被处理多少次,都有相同的ID
  • 不同的业务事件,即使内容相似,也有不同的ID
类比: 就像身份证号码一样,每个人(事件)都有唯一的号码,即使有重名(相似内容),身份证号也不会重复。

🔧 Event ID的设计策略

1. 业务语义化ID

构成要素
优势
  • 可读性强,容易理解和调试
  • 包含业务语义,便于排查问题
  • 自然去重,相同业务事件ID相同

2. 组合哈希ID

当业务信息太长时

📊 Event ID在通知系统中的生命周期

1. 事件产生阶段

业务系统生成Event ID

2. 通知处理阶段

通知服务使用Event ID

3. 去重记录阶段

持久化已处理的Event ID

🔄 不同场景下的Event ID策略

1. 重试场景

网络超时重试

2. 多实例并发场景

多个通知服务实例同时处理相同事件

3. 延迟处理场景

延迟队列中的事件

🎯 Event ID的高级应用

1. 事件溯源(Event Sourcing)

完整的事件历史

2. 业务幂等性保证

基于Event ID的业务幂等

3. 跨系统一致性

多个系统使用相同Event ID

💾 Event ID的存储和管理

1. 存储策略

Redis + 数据库双写

2. 数据清理

过期数据清理

3. 性能优化

批量查询优化

⚠️ Event ID设计的注意事项

1. ID冲突问题

避免意外冲突

2. ID长度平衡

可读性 vs 存储效率

💡 核心总结

Event ID是通知系统"恰好一次"的关键
  1. 唯一标识:每个业务事件都有全局唯一的ID
  1. 天然去重:相同事件ID只处理一次
  1. 业务语义:ID包含足够的业务信息
  1. 系统一致性:多个系统使用相同Event ID保证一致性
  1. 可追溯性:完整记录事件处理历史
设计原则
  • 业务导向:ID要反映真实的业务事件
  • 全局唯一:跨系统、跨时间都不重复
  • 信息充分:包含足够的上下文信息
  • 格式一致:团队内统一ID生成规则
 
 
 
notion image
 
 
 

需要retry?

通知系统需要重试的根本原因
  1. 分布式系统天然不可靠:网络、服务、依赖都可能失败
  1. 外部依赖不可控:第三方推送平台、邮件服务等有自己的限制
  1. 用户体验要求:用户期望收到所有重要通知
  1. 业务连续性:通知失败可能影响业务流程
  1. 成本效益:自动重试比人工处理更经济
 
 
 
 
保持幂等性
问题场景:
  1. 第一次发送推送请求
  1. 推送平台收到并处理成功
  1. 但响应在网络中丢失
  1. 通知服务以为失败,重试发送
  1. 用户收到两次相同推送
解决方案:使用Event ID确保幂等性
  • 每次重试使用相同的Event ID
  • 推送平台根据Event ID去重
  • 即使重试多次,用户只收到一次推送
 
生成url shortenerChat system设计
Loading...
Catalog