当前位置: 首页 > news >正文

高并发通知系统设计笔记:如何安全发送百万级/亿级推送?

在大型促销(如双11、Black Friday)或突发事件发生时,营销团队常常需要瞬间向百万甚至亿级用户推送通知。如果直接在请求处理程序中同步循环发送,会导致请求线程阻塞、内存与 CPU 飙升,最终压垮服务器。

在 On-call 场景里也有类似需求,比如 Status Page 服务发布故障信息,就是一个巨大的邮件广播。比如很多人关注并订阅了 DeepSeek 的 Status Page,如果 DeepSeek 故障,Flashduty 就要给所有订阅用户发送邮件通知。

高并发通知系统的核心设计原则是:将“通知生成”与“通知分发”彻底解耦,从追求“发送速度”转变为保障“系统安全”。

核心架构设计

1. 基于队列的异步处理

系统引入消息队列(如 Kafka、RabbitMQ)作为缓冲区。

  • 流程:API 接收到推送请求后,仅负责将通知任务写入队列,随后立即返回。
  • 优势:队列能有效吸收瞬间的流量峰值。即使 100 万条通知在几秒内涌入,后端 Worker 也可以按照自身能够承受的受控速率逐步消费并处理,保护了应用层。

2. 独立扩展的 Worker 集群

将处理通知的 Worker Fleet(工作节点集群)与前端应用服务器分离,实现独立弹性扩缩容。

  • 系统可根据队列堆积深度(Queue Depth)动态调整 Worker 数量。例如队列中有 1 万条消息时运行 10 个 Worker,达到 100 万条时自动扩容至 1000 个 Worker,而应用层始终不受影响。

关键技术决策与陷阱应对

陷阱一:下游第三方服务限流(Rate Limiting)

当我们拥有足够的 Worker 时,瓶颈往往会转移到下游通知渠道(如 Firebase、APNs、邮件服务商)。如果盲目追求高并发,会导致下游触发频率限制。

  • 决策在 Worker 层引入速率限制器(Rate Limiter)。即使队列中有海量数据,Worker 也必须严格按照下游供应商允许的最大速率发送。此时队列积压是安全的,比压垮依赖项要好得多。

陷阱二:分布式环境下的重复发送(幂等性设计)

在分布式系统中,“至少交付一次(At-least-once)”是常见网络策略。如果 Worker 成功发送了通知,但在向队列提交 Confirm/Offset 之前崩溃,队列会重新投递该消息,导致用户收到重复通知。

  • 决策确保通知处理具备幂等性(Idempotency)
  1. 为每条通知生成全局唯一的notification_id
  2. 在调用下游发送前,向数据库(或 Redis)尝试插入该 ID:
INSERTINTOprocessed_notifications(notification_id)VALUES('NOTIF-1001');
  1. 利用数据库的唯一约束(Unique Constraint),若插入成功则执行发送;若失败(报主键冲突)则说明已处理过,直接跳过。

陷阱三:亿级(100M+)超大流量过载

当面对 1 亿以上用户时,如果一次性把 1 亿条消息全部打入 Kafka,会导致消息队列瞬间过载或 OOM。

  • 决策分阶段逐步生成。将“活动定义”与“通知生成”分离开。由一个专用的生成器(Generator)以可控的步长逐步(Progressively)创建通知任务并分批打入队列,避免一次性淹没队列。

优化与运维保障

1. 批量分发(Batching)

  • 对比:如果 1 次 API 调用仅发送 1 条通知,100 万条通知就需要 100 万次网络 I/O。
  • 优化:大部分主流供应商提供 Batch API。通过将 500 条通知合并为一个 Batch 请求发送,100 万条通知只需 2000 次请求,极大降低了网络开销与上下文切换带来的损耗。

2. 失败重试与死信队列(DLQ)

由于设备 Token 失效、邮箱错误或临时网络抖动,通知必然会出现失败。

  • 策略:引入带有指数退避(Exponential Backoff)的重试队列。
  • 死信队列:限制最大重试次数(如 5 次)。超过上限仍失败的消息投递到死信队列(Dead Letter Queue),由运维团队后续通过监控进行排查与异步修复。

3. 异步事件驱动的数据分析(Delivery Tracking)

市场部通常需要追踪“已发送、已送达、已打开、失败”等指标。

  • 设计:通知供应商的回调(Callbacks)通过异步事件进行处理。分析系统的流量与通知发送的流量相互独立,避免数据分析压力反噬发送链路。

总结

一个生产级别的海量通知系统,核心在于控制力

  1. 队列控制对内部应用层的冲击。
  2. 限流控制对外部下游的冲击。
  3. 幂等解决分布式架构的副作用。
  4. 批处理与异步事件榨干系统性能。
http://www.jsqmd.com/news/1152909/

相关文章:

  • 对于设计网站的思路
  • Simple Clock:一款专注于效率与隐私的现代时钟应用解决方案
  • 前端工程师必看!收藏这份AI大模型应用转型指南,3步实现“页面开发者”到“AI应用架构师”跃迁!
  • 2026年最新盘点8个一键生成论文工具,半天搞定万字论文!
  • 树莓派PyTorch 1.8.1 模型部署对比:原生推理 vs ONNX Runtime 性能实测
  • 计算机毕业设计之旅游网站管理系统
  • 优质的DD中空转台生产厂家有哪些
  • .NET编码规范04-代码布局与注释规范
  • 必应搜索API 2025年停用:2种替代方案与SerpApi实战迁移
  • 郑州律所性价比亲测分享
  • 专业编程课堂实拍
  • AppImageLauncher终极指南:5步实现Linux桌面AppImage无缝集成与管理
  • 环境初始化与安装
  • 信号完整性误区解析:方波下降沿反射电压为0V?2个关键概念纠偏
  • AI智能体入门指南:小白程序员必备,收藏学习大模型新趋势!
  • 导电炭黑的特性
  • 跨境小众国风设计师品牌营收程序,海外独立工作室低成本运营收支测算。
  • 硬件开发调测
  • 不会摄影也能做大片?GPT-Image-2 背景虚化从入门到实战
  • PL2303老旧芯片Windows 10兼容性终极修复指南:3种方案解决驱动签名问题
  • 纯内网知识库怎么建设:用 zyplayer-doc 做私有化文档管理平台
  • 域适应实战:3种主流方法(ADA/UDA/SFDA)在图像分类任务上的PyTorch实现对比
  • EKF CD3-99-JIVE 通讯模块
  • 计算机毕业设计之基于SSM框架的网上购物系统
  • 计算机毕业设计之基于SSM框架的社区消防设施管理系统设计与实现
  • 怎样高效实现微信群消息智能转发:自动化同步完整指南
  • 现货黄金交易软件如何下截--完整版流程
  • 国内开发者实战指南:从零部署OpenAI Codex AI编程助手
  • android studio打包apk生成当前时间
  • PL2303老旧芯片Windows 10驱动修复终极指南:让停产设备重获新生 [特殊字符]