题目与场景
同一用量事件既服务运行时限额,也服务财务报表。事件可能迟到、重复或被修正,噪声租户不能拖慢其他租户,也不能读取他人数据。
面试官在考察什么
- 分离不可变事实与可变投影。
- 定义幂等、事件时间窗口、修正和账单最终性。
- 设计租户隔离、背压与核对证据。
作答前的澄清问题
- 事件速率、维度、保留期和账单最终截止时间是多少?
- 用量按请求接受、完成还是业务效果成功来计量?
- 生产方能否重发事件 ID,修正或退款如何表示?
- 哪些配额决策需要秒级新鲜度,哪些报表可以延迟?
30 秒回答框架
我会记录带稳定事件 ID、事件时间、单位、来源和模式版本的租户范围不可变事实。追加日志分别驱动配额与账单投影。去重键是租户加事件 ID;修正写成新事实而不是覆盖。配额读取快速且有界的投影,账单在水位线和核对完成后才关闭。每个聚合都能追溯到源事实。
分步深挖
1. 捕获事实
认证生产方,校验租户范围和单位,持久化原始事件后再确认。要求生产方事件 ID、来源、事件时间和计量版本。拒绝格式错误或跨租户写入,并保留摘要以便审计。
2. 实现幂等写入
对 (tenant, source, event_id) 建唯一约束。同一摘要的重复返回已有结果;摘要不同则隔离为冲突。不能把发票行当幂等存储,因为运行时重试早于开票。
3. 分离配额与账单投影
配额投影维护短窗口、当前计数和新鲜度未知时的闭合策略。账单按合同单位和价格版本聚合,保留事件时间桶与修正关联。两个投影都不修改不可变事实日志。
4. 处理迟到数据并关闭账单
用观测事件时间加约定迟到界限形成水位线。水位线之后到达的事件进入调整台账,计入下一周期或贷项流程。最终确认前,从日志核对计数与总和并记录计算版本。
5. 安全运营
按租户或公平分配键分区队列与存储,实施配额和背压并隔离死信。监控接入延迟、重复与冲突率、水位线年龄、投影漂移、修正量和关账延迟。加密数据、限制导出并审计每次修正。
高质量示范回答
“我会在确认前保存带事件 ID、来源、事件时间、单位、模式和价格版本的租户范围不可变用量事实。追加日志分别驱动配额与账单投影。同 ID 同摘要重试幂等,摘要变化进入隔离。配额使用快速有界投影,账单等迟到水位线和核对完成后再关闭。迟到事件写入调整记录,并用租户分区、背压、加密和漂移指标保证正确性与公平性。”
常见失误
- 每个事件直接覆盖聚合 → 迟到和修正不可见 → 保留不可变事实与投影。
- 用到达时间作为用量时间 → 延迟事件进入错误账单 → 按事件时间和水位线分桶。
- 共享一个全局队列 → 噪声租户造成队首阻塞 → 分区或实施公平分配。
- 不核对就关账 → 投影漂移变成账单争议 → 与源事实比较并版本化计算。
追问与回答
如何支持退款或修正?
追加关联原事件与合同版本的补偿事实。重算受影响投影或写入调整台账,不能修改原始证据。
配额和账单暂时不一致怎么办?
声明不同的新鲜度与最终性保证。配额可在有界窗口内近似,账单等水位线和核对通过后才最终化,并向运营与客户暴露状态。
如何阻止租户读取他人用量?
在写入、存储分区、投影查询、导出和支持工具中强制租户范围。每个边界都测试授权,访问日志不包含敏感事件负载。