慣性聚合 高效追讀感興趣之博客、新聞、科技資訊
閱原文 以慣性聚合開啟

推薦訂閱源

Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
M
MIT News - Artificial intelligence
博客园 - 叶小钗
MyScale Blog
MyScale Blog
V
Visual Studio Blog
月光博客
月光博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
I
InfoQ
有赞技术团队
有赞技术团队
阮一峰的网络日志
阮一峰的网络日志
Jina AI
Jina AI
V
V2EX
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Blog — PlanetScale
Blog — PlanetScale
Last Week in AI
Last Week in AI
雷峰网
雷峰网
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python)
通知系统技术规范
MOTY · 2026-05-24 · via DEV Community

MOTY

总览

设计一高可靠之通知系统,支持推送通知、短信及电子邮件,服务逾百万用户。此系统须保证:

  • 无重复通知
  • 无遗漏发送
  • 于服务商故障时仍能优雅降级
  • 具备可伸缩性与可观测性

高阶架构

Client/API
   ↓
Notification Service
   ↓
Message Queue (Kafka/SQS/RabbitMQ)
   ↓
Notification Workers
   ↓
Provider Adapters
(SendGrid, Twilio, Firebase, etc.)
   ↓
Webhook/Event Processor
   ↓
Notification Database + Audit Logs

入全屏模式 出全屏模式


核心组件

1. 通知API服务

处理:

  • 通知之创建
  • 验证
  • 幂等性检查
  • 消息排队

每请求得:

  • 通知标识
  • 幂等键

是也。服务储通知于处理前,以保其久存。


2. 消息队列

用 Kafka/SQS/RabbitMQ 以行异步之务。

其利有:

  • 生消相离
  • 纳流之峰
  • 持重试之能
  • 阻请之碍

信息永续,待其成功处理而存之。


3. 通知工者

专司者:

  • 电子邮件
  • 短信
  • 推送之讯

责:

  • 消受队列之讯
  • 遣送通知
  • 重试暂时之败
  • 更新递送状态

工作者横向扩展


可靠性策略

不可变性

每条通知皆有:

  • 唯一通知标识
  • 不可变键

数据库约束:

UNIQUE(idempotency_key)

进入全屏模式 退出全屏模式

发送前:

  • 工人察若警示已效
  • 止复遣于重试

重试& 失败之理

失败之别:

  • 暂时者 → 重试
  • 永绝者 → 立即败

重试之策:

  • 指数退避
  • 死信队列(DLQ)
  • 最大重试阈值

例如:

1 min → 5 min → 15 min → 1 hour

进入全屏模式 退出全屏模式


优雅降级

若提供者失效:

  • 备用提供者自动激活

例如:

Twilio fails → switch to Termii
SendGrid fails → switch to SES

进入全屏模式 退出全屏模式

断路器可阻绝频呼不康之供者。


物送跟蹤

網鉤處理者得:

  • 已達
  • 未達
  • 退回
  • 開展之事件

諸事件悉儲於審計表。


資庫設計

表:

  • 通知
  • 投递尝试
  • 提供者日志
  • 模板
  • 用户偏好

索引:

(user_id, created_at)
(status, channel)
(notification_id)

进入全屏模式 退出全屏模式


防止遗漏发送

为避免信息遗失:

  • 存储于队列前之通知
  • 采用事务性发件箱模式
  • 调和之务,检视滞留之讯

例:

PENDING > 10 mins → requeue

入全景模式 出全景模式


可察之境

监察:

  • 队列之深
  • 供者之迟
  • 重试之数
  • 失达之率

器用:

  • 普罗米修斯
  • 格拉菲娜
  • 云观测
  • 信使

警报于异常失效峰值时触发


可扩展性

系统支持百万以上用户,其法有:

  • 水平工作扩展
  • 分区队列
  • 无状态服务
  • Redis缓存
  • 適用時批處理

安全校備

  • 加密供應者憑證
  • 簽署網頁回呼
  • 速率限制
  • RBAC供管理員訪問
  • 所有通知事件審計記錄

技術堆疊範例

  • 後端:Node.js / Python
  • 佇列:Kafka或SQS
  • 資料庫:PostgreSQL
  • 快取:Redis
  • 提供者:Twilio(Firebase, SendGrid)
  • 監控:Grafana + Prometheus
  • 部署:Kubernetes/ECS