慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

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

概覽

設計一個高度可靠的通知系統,支援推播通知、SMS 和電子郵件,用於超過 100 萬用戶。該系統必須保證:

  • 無重複通知
  • 無遺漏發送
  • 供應商故障時的優雅降級
  • 可擴展性和可觀察性

高階架構

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. 通知工作員

專用工作員用於:

  • 電子郵件
  • 簡訊
  • 推播通知

職責:

  • 處理佇列訊息
  • 發送通知
  • 重試暫時性失敗
  • 更新送貨狀態

員工水平擴展.


可靠性策略

給予性

每個通知都有:

  • 獨特的通知_id
  • 給予性鍵

資料庫約束:

UNIQUE(idempotency_key)

Enter 全螢幕模式 Exit 全螢幕模式

發送前:

  • 工人檢查通知是否已成功
  • 在重試期間防止重複發送

重試 & 失敗處理

失敗分類為:

  • 暫時性 → 重試
  • 永久性 → 立即失敗

重試策略:

  • 指數退避
  • 死信佇列 (DLQ)
  • 最大重試閾值

範例:

1 min → 5 min → 15 min → 1 hour

進入全螢幕模式 離開全螢幕模式


優雅降級

如果提供者失敗:

  • 備用提供者自動啟動

範例:

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

進入全螢幕模式 離開全螢幕模式

斷路器防止持續呼叫不健康的供應商.


送貨追蹤

Webhook 處理器接收:

  • 已送達
  • 送達失敗
  • 退回
  • 已開啟事件

所有事件儲存於審計表中.


資料庫設計

表格:

  • 通知
  • 送達嘗試
  • 提供者日誌
  • 範本
  • 用戶偏好

索引:

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

進入全螢幕模式 退出全螢幕模式


防止錯過發送

為避免訊息丟失:

  • 通知儲存於排隊前
  • 使用交易發送模式
  • 和解任務掃描卡住的通知

範例:

PENDING > 10 mins → requeue

進入全螢幕模式 離開全螢幕模式


觀察力

監控:

  • 佇列深度
  • 提供者延遲
  • 重試次數
  • 失敗交付率

工具:

  • Prometheus
  • Grafana
  • CloudWatch
  • Sentry

警報會在異常失敗尖峰時觸發.


可擴展性

系統支援通過以下方式支持100萬以上用戶:

  • 水平工作員擴展
  • 分區隊列
  • 無狀態服務
  • Redis快取
  • 適用批次處理

安全性

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

技術堆疊範例

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