0. 两个现象,一个共同的形状
这篇复盘两次问题。它们表面上看没有关系:
技术博客与学习记录
这篇复盘两次问题。它们表面上看没有关系:
这次重设计的起点不是"界面不好看",是一件更实际的事:字体没覆盖中文。
做这个接口的时候遇到的第一个问题不是技术问题,是语义问题。
第 12 篇讲了三层缓存,但留了一个尾巴没讲:缓存什么时候该失效。
第 1 篇里算过一笔账:relay-gateway 处理一个请求,要打四次下游 gRPC——identity 鉴权、channel 选路、billing 预扣、billing 结算,外加写日志。
我第一版迁移就是一个编号序列:001_xxx.sql、002_xxx.sql……每个文件一个号,跑的时候按号排序。
用户买了一个月的套餐,付了 20 块。用了 10 天,要求退款。
这套结构里真正需要照抄的东西不多,但如果不照抄那几样,后面就很难改回来。这篇分成两部分:第一天必须有的(不做后面会痛),和可以后补的(做早了是浪费)。然后走一遍"加一个资源"的完整步骤。
两次问题表面上没关系:一次是一个渠道上所有模型都不可用,实际只有一个模型坏了;另一次是 /v1/responses 集中返回 502,实际上游返回的是 4xx。但它们形状一样——我的系统在一个更粗的粒度上做了判断,而真实问题发生在更细的粒度上。
一个看起来很简单的问题,答案不简单:用户买了一个月套餐、用了 10 天、要求退款,退多少钱?而这只是开始——订阅怎么处理、已经消耗的额度怎么算、续过费先退哪个、账本上怎么写。这篇讲我怎么处理这三个操作,以及一个跨所有操作的机制:购买时的套餐快照。