36 lines
1.7 KiB
Markdown
36 lines
1.7 KiB
Markdown
# 数据流
|
||
业务触发
|
||
业务系统(如任务到期、任务创建、状态变更)先产生日志化业务事件。
|
||
事件带基础字段:event_id、event_type、user_id、occurred_at、payload。
|
||
|
||
通知规则判断
|
||
规则引擎判断这条事件是否需要通知、通知谁、用什么模板。
|
||
同时做用户偏好过滤(是否订阅、免打扰时段、语言、时区)。
|
||
|
||
调度器编排
|
||
立即通知:直接进入投递流程。
|
||
定时通知:调度器按 cron/延时规则在目标时间生成通知任务。
|
||
这一层负责时区换算与批量窗口控制(避免瞬时洪峰)。
|
||
|
||
写入 MQ
|
||
通知任务由生产者写入 MQ(如 notification.jobs)。
|
||
任务包含:job_id、channel=email、to、template_id、params、trace_id、retry_count 等。
|
||
|
||
消费者处理
|
||
Worker 从 MQ 拉取任务,先做幂等检查(idempotency_key)。
|
||
如果判定“已发送过”,直接 ACK 丢弃重复任务。
|
||
否则进入渠道网关(Email Adapter)。
|
||
|
||
渠道网关发送(Email)
|
||
网关将模板渲染后的邮件通过 SMTP/邮件服务商发出。
|
||
返回成功或失败结果,并带错误码。
|
||
|
||
可靠性机制
|
||
成功:记录 sent 状态并 ACK MQ。
|
||
可重试失败(超时、限流、临时网络故障):写入重试队列,按指数退避再次投递。
|
||
不可重试失败(地址非法、模板错误)或超最大重试:进入 DLQ 死信队列,等待人工/自动补偿。
|
||
|
||
状态回写与观测
|
||
每次处理都会回写通知状态(pending/sent/failed/dead)到存储层。
|
||
同时上报指标和日志:送达率、重试次数、端到端延迟、失败原因分布。
|
||
告警系统基于阈值触发报警(如失败率突增、队列堆积)。 |