当前位置: 首页 > news >正文

基于 Stripe/Metering 的用量计费:从 SLO 指标到账单流水

基于 Stripe/Metering 的用量计费:从 SLO 指标到账单流水 🎯


📚 目录

  • 基于 Stripe/Metering 的用量计费:从 SLO 指标到账单流水 🎯
    • 0) 摘要(TL;DR)🚀
    • 1) 名词与口径统一(SLO ↔ 计量 ↔ 计费)📏
    • 2) 目标架构 🧭
    • 3) 端到端时序 🧵
    • 4) 数据模型与表设计(PostgreSQL)🗄️
    • 5) Webhook 幂等与无序处理 🧩
    • 6) 账期/窗口/宽限期时间线 🗓️
    • 7) 多租户与权限边界(ABP)🏷️
    • 8) Stripe 集成要点 🧩
      • 8.1 创建 Meter、Price 并绑定(Price↔Meter)
      • 8.2 记录用量(v1 与 v2)📨
      • 8.3 修正与迁移 🧯
    • 9) 幂等结算与对账 🧮
    • 10) 欠费保护与停复机 🛡️
    • 11) 发票“最终化”与宽限 ⌛
    • 12) API v2 流式上报 🌊
    • 13) 可观测性与 SLO 🔭
    • 14) 运行与运维 🧰
    • 15) 代码骨架(ABP 模块 & 后台作业)🧱
    • 16) 常见坑(踩雷清单)⚠️


0) 摘要(TL;DR)🚀

ABP vNext 中落地从 SLO 指标 → 计量 (Meter) → 账单流水 的闭环:业务埋点 → Usage Ledger 幂等入账 → Stripe Meter Events 上报(带 timestamp 与业务幂等 identifier)→ Stripe 账期聚合生成发票 → Webhook 对账与欠费保护
要点:

  • Meters 取代 legacy usage-records(新项目一律使用 Meters)。
  • 事件时间戳需在过去 35 天未来 5 分钟内;用量值为整数
  • Price↔Meter 通过 price.recurring.meter 绑定;订阅项引用该 Price。
  • 发票默认 1 小时“最终化”宽限,可配置(例如用量型 72h)。
  • 高吞吐使用 API v2 Meter Event Streams(先建会话 token,15 分钟有效)。

1) 名词与口径统一(SLO ↔ 计量 ↔ 计费)📏

  • SLI/SLO/SLA → Billable Metrics:仅将“可结算使用量”纳入口径;定义单位(次、条、千 tokens…)、聚合函数(sum/count/last)、窗口与时区。
  • 时间戳与整数值:上报事件 timestamp 必须在过去 35 天未来 5 分钟payload[value]整数(建议内部用“毫单位”整型)。
  • 账期与窗口:预聚合 day/hour 的边界按 UTC 对齐;同一窗口内后到事件覆盖先到(pre-aggregated 语义)。
  • 按千/打包计费:价格层可用 transform_quantity 做归一化(例如“每 1000 次计费”)。⚠️ 与复杂阶梯价组合时的效果需事先走通样例,确保口径一致。

2) 目标架构 🧭

结算层
聚合层
采集层
埋点(TraceId, Value, UTC)
tenant×feature×UTC窗口
批/幂等
invoice.*, subscription.* Webhook
Stripe Billing💳
Products/Prices + Meters
ReconSnapshot/报表📑
运维/风控🛡️
UsageWindowAgg📊
Meter Events 队列🧱
UsageLedger🧾
应用/任务/边缘网关📲
  • Meters 附着在 Price 上:在 Pricerecurring.meter 字段绑定 Meter(订阅项引用该 Price,从而“带出”Meter)。
  • API v2 流式:先创建 meter event session(token 15 分钟),再向流式端点推送 NDJSON;10k EPS(可申请更高)。
  • ABP 多租户ICurrentTenant 贯穿上下文;实体实现 IMultiTenant 自动按租户过滤。

3) 端到端时序 🧵

http://www.dtcms.com/a/393619.html

相关文章:

  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘fastapi’ 问题
  • 论文阅读——隧道中毫米波MIMO信道特性的实验研究
  • The Library: 1靶场渗透
  • 23种设计模式之【装饰器模式】-核心原理与 Java实践
  • 动态规划中的背包问题:0/1 背包与完全背包的核心解析
  • PHP应用-组件框架前端模版渲染三方插件富文本编辑器CVE审计(2024小迪安全DAY30笔记)
  • uniapp 如何判断发的请求是网络异常uni.request
  • 学习:uniapp全栈微信小程序vue3后台 (25)
  • 23种设计模式之【原型模式】-核心原理与 Java实践
  • Netty 重放解码器ReplayingDecoder揭秘:重写轻量异常机制 和 ConstantPool
  • getgeo 生物信息 R语言 表型信息表”“样本信息表”或“临床信息表 phenodata phenotype data
  • OceanBase备租户创建(二):通过BACKUP DATABASE PLUS ARCHIVELOG
  • Linux文件打包压缩与软件安装管理完全指南
  • KingbaseES数据备份操作详解(图文教程)
  • 中断屏蔽实现方法-ARM内核
  • Kotlin 协程之 SharedFlow 与 StateFlow 深度解析
  • python爬虫(请求+解析+案例)
  • 111-Christopher-Dall_Arm-Timers-and-Fire:Arm架构计时器与半虚拟化时间
  • switch缺少break出现bug
  • 【自然语言处理】(3) --RNN循环神经网络
  • C# 中的 ReferenceEquals 方法
  • BERT:用于语言理解的深度双向Transformer预训练【简单分析】
  • 力扣hot100:两数相加(模拟竖式加法详解)(2)
  • Zotero + Word 插件管理参考文献的引用
  • 用Python一键整理文件:自动分类DOCX与PDF,告别文件夹杂乱
  • Ubuntu部署Elasticsearch教程
  • 61.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--提取金额
  • 一款基于 .NET 开源、免费、命令行式的哔哩哔哩视频内容下载工具
  • Win Semi宣布推出线性优化的GaN工艺
  • 考研408计算机网络2025年第38题真题解析