1. 课程导入与全景认知

SaaS 的商业模式从"卖许可证"转向"卖用量"之后,工程团队面对的第一个硬问题就是:一次用户行为,究竟该被记成多少量?这个问题看似只是计数,实际牵动计费准确性、客户信任、成本核算与产品定价四条线。本章不写代码,先把全景铺开——搞清楚计量与配额到底在解决什么、边界画在哪里、系统由哪些部件组成,为后续 29 章的深入实现建立坐标系。

一、业务价值:为什么计量与配额是 SaaS 的"水电表"

传统软件一次性售卖,收入在签约时确定;SaaS 按用量收费,收入随客户行为持续产生。这意味着计量数据本身就是收入凭证。如果计量漏记,公司少收钱;如果重复计量,客户投诉甚至流失;如果计量延迟,财务无法及时出账。三类典型损失可以这样理解:

  • 收入泄漏:API 调用未被采集,某客户月均 200 万次调用只记到 180 万次,按 0.001 元/次计,单客户每月损失约 200 元,千客户规模即年损失约 240 万元。
  • 成本失控:配额不设上限,某租户跑批任务把共享数据库连接池打满,影响其他租户,SLA 违约赔偿远超该租户贡献的收入。
  • 信任崩塌:账单与客户自建监控对不上,客户要求逐条核对,支持成本飙升,续约率下降。

因此,计量与配额不是"计费系统的一个模块",而是贯穿产品、研发、财务、客户成功的横向能力。它的价值可以概括为三句话:让收入可追溯、让成本可约束、让客户可自证。

二、核心概念:把"用量"拆成可工程化的对象

要工程化,先要统一语言。以下五个概念是后续所有设计的基石,建议先建立精确定义:

概念定义示例
计量事件(Meter Event)一次可被计量的业务动作,含租户、指标、数量、时间戳、幂等键租户 T-1001 在 10:00:03 调用 OCR 接口 1 次,事件 ID evt_9f2a
计量指标(Metric)被计量的维度,决定"记什么"api_calls、storage_gb_hours、seats_active、tokens_processed
聚合(Aggregation)把原始事件按时间窗与维度汇总按小时 SUM(api_calls),按天 MAX(storage_gb)
配额(Quota)对某指标在周期内的允许上限或速率限制每月 100 万次 API 调用;每秒 50 次并发
用量快照(Usage Snapshot)某时刻已确认的累计用量,用于展示与出账截至 10 月 20 日 24:00,已用 63.2 万次

这里有一个容易混淆的点:计量(Metering)与计费(Billing)不是一回事。计量回答"用了多少",计费回答"该收多少钱"。计量输出的是用量事实,计费再叠加价格计划、折扣、税费、账期。把两者混在一个服务里,会导致价格调整时被迫改动采集链路,风险极高。

三、系统边界:谁负责记,谁负责算,谁负责收

画清边界是本章最重要的工程决策。一个常见的错误是把计量逻辑散落在各业务服务里,每个服务自己写数据库计数,结果口径不一、无法对账。正确的做法是业务服务只负责"上报事件",计量平台负责"接收、聚合、存储、查询"。

边界可以这样划分:

  • 业务侧:在关键动作处埋点,生成计量事件并异步投递,不阻塞主流程。
  • 计量平台:接收事件、幂等去重、按窗口聚合、写入时序/分析存储、对外提供用量查询 API。
  • 配额服务:维护配额定义与实时消耗,提供"检查—扣减—回滚"接口,供业务侧在动作前调用。
  • 计费系统:从计量平台拉取已确认用量,结合价格计划生成账单,不直接接触原始事件。

下面这张图给出整体工程框架:左侧是业务动作产生事件,中间是计量与配额双通道,右侧是消费方。注意配额通道是同步、低延迟的,计量通道是异步、可缓冲的,两者共享同一份指标定义,但走不同的技术路径。

SaaS 用量计量与配额管理 · 整体工程框架 业务侧 API 网关 调用埋点 应用服务 存储/席位变更 AI 推理服务 Token 消耗 定时任务 批量作业 统一埋点 SDK 计量通道(异步) 事件接收 · 幂等去重 消息缓冲(Kafka) 窗口聚合 · 用量快照 配额通道(同步) 配额定义 · 周期规则 实时计数器(Redis) 检查 · 扣减 · 回滚 用量存储 时序库 分析库 快照表 消费方 计费系统 出账 · 对账 客户控制台 用量展示 告警与限流 阈值触发 成本分析 毛利核算 客户成功 事件 检查 放行/拒绝 写入 查询 同步 阈值 计量通道:异步、可缓冲、最终一致,保证不丢不重;配额通道:同步、低延迟、强一致,保证不超卖

四、典型场景:四类必须覆盖的用量形态

不同产品的用量形态差异极大,工程上要提前识别属于哪一类,因为它直接决定聚合方式与配额策略:

  1. 计数型:API 调用次数、消息条数。特点是高频、可累加,适合 SUM 聚合,配额用"周期总量 + 速率限制"双约束。
  2. 计量型:存储 GB、Token 数。特点是数值连续,需要按时间加权,例如"存储 GB·小时",配额用"峰值上限"。
  3. 状态型:活跃席位、并发连接数。特点是随时间变化,需要记录状态变更事件,聚合用 MAX 或按时间积分。
  4. 资源型:GPU 时长、专属实例。特点是占用即消耗,需要"开始—结束"配对,防止泄漏导致虚高。

以存储为例,若某租户 10 月 1 日存入 100 GB,10 月 11 日扩容到 300 GB,10 月 21 日删除到 150 GB,按"GB·天"计费,则 10 月用量为 100×10 + 300×10 + 150×11 = 5650 GB·天。这个计算说明:状态型指标必须记录变更时间点,否则无法还原。这也是很多团队初期用"每日快照"导致账单偏差的根因。

五、工程框架的四个关键设计原则

在进入后续章节前,先记住四条原则,它们会在每个模块反复出现:

  • 幂等优先:每个计量事件必须带唯一幂等键(如 tenant_id + metric + request_id),接收端去重,避免重试导致重复计量。
  • 先计量后计费:原始事件不可变,聚合结果可重算。价格调整只影响计费层,不回溯修改事件。
  • 配额与计量解耦:配额走同步快路径,计量走异步慢路径,两者通过同一份指标定义对齐口径,但不共享存储。
  • 可对账:任何时刻,客户看到的用量、计费系统用的用量、内部监控的用量,三者应能通过同一份快照对齐,差异可解释。
学习建议:本章不需要记住所有细节,但请务必建立"事件 → 聚合 → 快照 → 计费"这条主链路的直觉。后续章节会逐段拆开:第 2~6 章讲事件模型与采集,第 7~12 章讲聚合与存储,第 13~20 章讲配额与限流,第 21~26 章讲计费对接与对账,第 27~30 章讲运维、压测与演进。

最后强调一个常被忽视的边界问题:计量平台不应承担业务判断。它只回答"某租户某指标在某时间窗内用了多少",不回答"这个租户是否该被限流"。限流决策属于配额服务,计费决策属于计费系统。把判断逻辑上移到消费方,计量平台才能保持稳定、可重算、可审计——这正是整套工程框架能够长期演进的前提。