代表性面试主题

系统设计面试:设计多租户用量计量管道

系统设计困难
Offer.cc 编辑团队发布 更新

题干

设计一个为多租户计量 API 用量的服务,同时支持近实时配额和可信的月度发票。

题目与场景

同一用量事件既服务运行时限额,也服务财务报表。事件可能迟到、重复或被修正,噪声租户不能拖慢其他租户,也不能读取他人数据。

面试官在考察什么

  • 分离不可变事实与可变投影。
  • 定义幂等、事件时间窗口、修正和账单最终性。
  • 设计租户隔离、背压与核对证据。

作答前的澄清问题

  • 事件速率、维度、保留期和账单最终截止时间是多少?
  • 用量按请求接受、完成还是业务效果成功来计量?
  • 生产方能否重发事件 ID,修正或退款如何表示?
  • 哪些配额决策需要秒级新鲜度,哪些报表可以延迟?

30 秒回答框架

我会记录带稳定事件 ID、事件时间、单位、来源和模式版本的租户范围不可变事实。追加日志分别驱动配额与账单投影。去重键是租户加事件 ID;修正写成新事实而不是覆盖。配额读取快速且有界的投影,账单在水位线和核对完成后才关闭。每个聚合都能追溯到源事实。

分步深挖

1. 捕获事实

认证生产方,校验租户范围和单位,持久化原始事件后再确认。要求生产方事件 ID、来源、事件时间和计量版本。拒绝格式错误或跨租户写入,并保留摘要以便审计。

2. 实现幂等写入

(tenant, source, event_id) 建唯一约束。同一摘要的重复返回已有结果;摘要不同则隔离为冲突。不能把发票行当幂等存储,因为运行时重试早于开票。

3. 分离配额与账单投影

配额投影维护短窗口、当前计数和新鲜度未知时的闭合策略。账单按合同单位和价格版本聚合,保留事件时间桶与修正关联。两个投影都不修改不可变事实日志。

4. 处理迟到数据并关闭账单

用观测事件时间加约定迟到界限形成水位线。水位线之后到达的事件进入调整台账,计入下一周期或贷项流程。最终确认前,从日志核对计数与总和并记录计算版本。

5. 安全运营

按租户或公平分配键分区队列与存储,实施配额和背压并隔离死信。监控接入延迟、重复与冲突率、水位线年龄、投影漂移、修正量和关账延迟。加密数据、限制导出并审计每次修正。

高质量示范回答

“我会在确认前保存带事件 ID、来源、事件时间、单位、模式和价格版本的租户范围不可变用量事实。追加日志分别驱动配额与账单投影。同 ID 同摘要重试幂等,摘要变化进入隔离。配额使用快速有界投影,账单等迟到水位线和核对完成后再关闭。迟到事件写入调整记录,并用租户分区、背压、加密和漂移指标保证正确性与公平性。”

常见失误

  • 每个事件直接覆盖聚合 → 迟到和修正不可见 → 保留不可变事实与投影。
  • 用到达时间作为用量时间 → 延迟事件进入错误账单 → 按事件时间和水位线分桶。
  • 共享一个全局队列 → 噪声租户造成队首阻塞 → 分区或实施公平分配。
  • 不核对就关账 → 投影漂移变成账单争议 → 与源事实比较并版本化计算。

追问与回答

如何支持退款或修正?

追加关联原事件与合同版本的补偿事实。重算受影响投影或写入调整台账,不能修改原始证据。

配额和账单暂时不一致怎么办?

声明不同的新鲜度与最终性保证。配额可在有界窗口内近似,账单等水位线和核对通过后才最终化,并向运营与客户暴露状态。

如何阻止租户读取他人用量?

在写入、存储分区、投影查询、导出和支持工具中强制租户范围。每个边界都测试授权,访问日志不包含敏感事件负载。

公开来源

同类题目

相关面试工具

用 Solve 整理系统设计回答

从澄清需求开始,展开规模、架构、组件选择和取舍。

查看工具