1. 设置功能次数规则
在授权策略中启用 export 功能,设置每月上限为 500 次,并决定额度用完后拒绝还是按该功能的超额规则允许。
功能次数属于客户许可证,和厂商工作空间套餐的设备额度、API 调用额度分别计算。按日和按月的功能周期使用 UTC,每月在下一个 UTC 自然月开始时重置。
2. 启动一个 SDK 客户端
按 SDK 文档安装所用语言,通过 product.json 与客户授权码启动。九种 SDK 都有同一计次业务流程;下面展示 Go 调用,放在应用现有的返回 error 的函数中。
普通权益使用 RunFeature,次数限制操作使用 RunMeteredFeature。本地权益检查通过,不代表在线次数仍足够。
3. 将业务放进计次回调
调用前持久保存唯一任务编号,重试同一任务继续使用该编号。SDK 先预留一次,再执行回调,业务成功后确认,已确定失败时取消预留。
// client was opened once at application startup.
// jobID comes from your durable business task record.
jobID := os.Getenv("LICENTIVO_OPERATION_ID")
if jobID == "" {
return fmt.Errorf("persist a unique task ID before exporting")
}
err := client.RunMeteredFeature(ctx, "export", 1, jobID, func() error {
// Return success only after the output has been saved.
return os.WriteFile("licensed-report.txt", []byte("Metered export\n"), 0600)
})
if err != nil {
return err
}4. 恢复中断任务
任务已被记录为业务成功时,重试同一编号可以继续结算,不会重新执行回调。但如果进程在业务执行途中退出,SDK 无法判断外部操作是否已经完成。
先检查业务保存的结果;确认成功调用 ResolveMeteredFeature(ctx, jobID, true),确认失败则传 false。该接口只处理计次结算,不执行业务。不要盲目重复付款、交付文件或其他不可逆操作。
默认预留 15 分钟,并受 UTC 周期重置边界限制,需要在过期前完成与结算。可能超过预留时长的长任务不能直接使用简单回调封装。已取消任务如由客户重新发起,应使用新的任务编号。
5. 验证计次行为
- 先用较小测试额度,成功导出后已用次数应加一。
- 让回调在完成前返回错误,预留次数应取消。
- 重试已记录成功的编号,确认业务回调没有重复执行。
- 用完拒绝超额的额度,确认回调未执行,并展示下次重置时间。
- 在测试环境模拟任务中断,按已保存的业务记录恢复结算。
容易用错的地方
预留和确认需要联网,离线缓存许可证并不允许离线计次。计次操作被拒绝后不能改成普通权益操作继续执行。
直接 Consume 会立即扣次。如果需要业务成功后才计次,使用计次回调。业务完成后网络失败属于结算恢复问题,不能直接判断业务失败。
稳定任务编号和 SDK 日志帮助重试,但不能代替业务事务和结果持久化。恢复时需要同时保留业务结果以及 SDK 私有缓存。