消息与积分项目深挖
两个项目分别取证
| 维度 | 消息平台 | 积分系统 |
|---|---|---|
| 事实 | 渠道、调用方、日量/峰值、最大积压、状态与送达口径 | 获取/扣减/冻结/过期规则、账户/流水、热点账户、对账差错 |
| 不变量 | 请求可追踪,重复不造成错误副作用 | 不重复入账、不超扣,余额与有效流水一致 |
| 幂等键 | 业务消息 ID + 渠道/接收方 | 来源业务类型 + 来源业务 ID |
| 恢复 | 分类重试、死信、限速回放、人工补发 | 冲正/补录流水、差错审批与复核 |
| 指标 | lag、任务年龄、各渠道失败/送达率 | 入账失败、差错、余额异常 |
各准备一个失败案例,注明本人职责、前后指标、时间窗和数据来源。
消息平台追问
- 成功定义:平台受理、MQ 确认、渠道受理和用户送达分层记录。渠道回执缺失不等于发送失败,超时要按结果未知处理。
- 重复发送:业务唯一键和状态条件更新保护本地记录;渠道侧若有副作用,需要渠道幂等键或查询回执,数据库去重无法独自保证远程只发一次。
- 失败分类:限流/网络错误可退避重试;地址无效等永久错误停止重试;超预算转人工。营销、验证码、交易通知分别定义 TTL 与优先级,过期消息不盲目补发。
- 积压:先看生产/消费速率、任务年龄和渠道 RT;仅在下游有余量时扩容,恢复遵守渠道限额与新老流量优先级。
- 平台治理:模板、用户偏好、租户配额、渠道切换和回执可追踪;一次渠道调用成功不能等同平台端到端成功。
积分系统追问
- 事实来源:流水作为可审计事实,余额是事务内维护的聚合;明确撤销、冻结、解冻和过期是否进入可用余额。
- 重复入账:同一事务插入带业务唯一键的流水并更新账户;重复请求返回已有处理结果,失败整体回滚。
- 并发扣减:
UPDATE account SET balance=balance-? WHERE id=? AND balance>=?,检查影响行数;乐观锁冲突有界重试,多账户操作固定锁顺序。 - 过期:按积分批次及有效期追溯消耗来源;分片、限速、可重入,防止过期与消费并发重复扣减。
- 对账:按确定的流水状态/截止水位重算,与账户快照比较;区分延迟、漏账、重账和算法错误,修复走冲正/补录而非无痕改余额。
- 跨服务:本地事务保护账户与流水,Outbox 发布事件;消费者幂等、补偿与对账共同完成最终一致。
练习
分别画“渠道超时但已发出”和“同一积分事件并发到达”的时序;说明数据库事务能保护哪一步、远程副作用如何确认、重放如何审计。比较同步与异步、强一致与最终一致的真实成本。