内容提要
文章介绍CURD系统设计技巧,包括n+m返回值设计(返回入参便于追踪)、终态设计(处理超时状态)、两码一态(系统码与业务码区分错误)。这些方法能提升系统可维护性,在面试中展示技术深度,但需根据场景灵活应用。
延伸解读
返回值设计:提升排查效率的实用技巧
n+m返回值设计通过将入参与返回值一同返回,帮助调用方在日志中快速关联请求与结果,尤其适用于缺乏全链路追踪或高并发场景。但需注意,若公司已有完善的追踪标准或入参过大,则不宜全量返回,可选取关键字段。此设计体现了对调用方易用性的考量,能减少沟通成本,展现专业素养。
终态设计:分布式系统下的状态处理
在分布式系统中,超时是一种常见状态,但并非终态。文章强调需为超时推定一个最终状态(成功或失败),并举例说明:支付操作通常推定失败以避免资金损失,而退款则推定成功以保障用户体验。后台管理系统也需设置超时自动结束,防止流程卡死。此设计确保系统状态可收敛,避免不确定性带来的风险。
两码一态:系统码与业务码的分离
两码一态通过系统码和业务码共同确定最终状态,系统码反映系统级错误(如数据库异常),业务码反映业务规则错误(如参数校验失败)。这种设计有助于快速定位问题归属:系统码异常需开发介入,业务码异常可能只需运营处理。在复杂场景(如支付)中,还可通过编码前缀区分不同环节,提升问题定位的精确度。
Q&A
CURD系统设计中,n+m返回值设计是什么?有什么好处?
n+m返回值设计是指接口返回时,除了返回业务需要的m个值,还将入参的n个值一并返回。这样做的好处是便于追踪和排查问题,调用方可以通过一条日志同时看到入参和返回值,无需额外日志即可定位请求。
在什么场景下不建议使用n+m返回值设计?
不建议在以下场景使用:1. 公司内部有规范且严格执行的全链路追踪标准;2. 入参很大,不适合全量打印,可选取部分关键参数或完全不用。
什么是终态设计?为什么在分布式系统中需要终态设计?
终态设计是指系统状态必须有一个明确的最终状态。在分布式系统中,调用可能超时,超时不是终态,而是中间状态,需要推定成功或失败。终态设计可以避免流程卡在中间状态,保证系统可推进。
在支付和退款场景中,超时后应如何推定状态?为什么?
支付超时通常推定失败,因为如果推定成功,用户可能未付款就获得商品,导致商家损失;退款超时通常推定成功,因为如果推定失败,用户可能未收到退款,系统可后续自动重试退款,保证公平。
什么是两码一态?系统码和业务码分别代表什么?
两码一态是指通过系统码和业务码共同确定最终状态。系统码表示系统层面的处理结果(如成功、数据库异常),业务码表示业务层面的结果(如参数校验失败)。当系统码失败时,业务码通常无意义;当系统码成功时,需看业务码判断业务是否成功。
在后台管理系统中,如何应用两码一态来区分错误类型?
可以定义系统码如S000表示系统正常,S001表示数据库异常,S002表示空指针异常;业务码如B000表示业务正常,B001表示必填参数为空,B002表示参数校验失败。当系统码异常时,需要开发人员处理;当业务码异常时,可联系运营人员或提示用户。
两码一态在什么情况下不建议使用?
如果是给进程内部自身使用的接口,没有必要定义这么复杂的两码一态。