[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-idempotent-design-basics-zh-CN":3,"blog-adjacent-idempotent-design-basics-zh-CN":28,"blog-related-idempotent-design-basics-zh-CN":62},{"id":4,"slug":5,"title":6,"excerpt":7,"content":8,"cover":9,"tone":10,"author":11,"publishedAt":12,"updatedAt":12,"readingMinutes":13,"featured":14,"tags":15,"category":19,"seoSettings":27},31,"idempotent-design-basics","幂等设计：重复提交不只是用户手抖","网络重试、消息重投、用户连点，都会让同一个请求到达多次。幂等应该设计在接口里。","\u003Cp>做过支付类功能的团队大多遇到过重复扣款。表面原因是用户点了两次，真正的原因是接口没有能力区分“第二次请求”和“一个新请求”。\u003C\u002Fp>\n\u003Ch2>重复从哪里来\u003C\u002Fh2>\n\u003Cp>用户连点是最简单的场景，前端按钮禁用能挡住大部分，但挡不住网络层的重试。\u003C\u002Fp>\n\u003Cp>网关超时后自动重发、消息队列至少一次投递、定时任务补偿重跑，这三种情况在服务端都很常见。\u003C\u002Fp>\n\u003Cp>移动端弱网环境下，请求可能已到达服务端但响应丢失，用户重新提交几乎是必然。\u003C\u002Fp>\n\u003Ch2>三种实现方式\u003C\u002Fh2>\n\u003Cp>业务唯一键：订单号、流水号或客户端生成的请求号，配合数据库唯一索引，重复请求直接被拒。\u003C\u002Fp>\n\u003Cp>状态机校验：只有处于特定状态的记录才能被推进，已经完成的操作再次提交直接返回上次结果。\u003C\u002Fp>\n\u003Cp>去重表：记录请求号与处理结果，重复请求返回缓存结果，适合跨服务调用。\u003C\u002Fp>\n\u003Cp>幂等不是可选优化，而是接口契约的一部分。设计时多想一步，线上就少一次对账。\u003C\u002Fp>","","blue","佳益方圆团队","2026-10-05T10:13:00+08:00",1,false,[16,17,18],"接口设计","幂等","可靠性",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":10,"kind":25,"sortOrder":26,"count":20},0,"engineering","技术专栏","架构设计、性能优化、AI 集成与跨端方案等一线技术实践，由研发团队持续分享。","cpu","article",60,{},{"previous":29,"next":45},{"id":30,"slug":31,"title":32,"excerpt":33,"content":9,"cover":9,"tone":10,"author":11,"publishedAt":34,"updatedAt":34,"readingMinutes":13,"featured":14,"tags":35,"category":39},10,"quote-by-scope-not-hours","我们为什么不按人天报价","按人天报价看起来公平，实际把不确定性都推给了客户。我们更愿意先讲清范围和假设，再谈价格。","2026-10-07T09:00:00+08:00",[36,37,38],"创业","报价","合作方式",{"id":40,"parentId":20,"slug":41,"name":42,"description":43,"icon":44,"cover":9,"tone":10,"kind":25,"sortOrder":30,"count":20},6,"founder-notes","创业手记","创始团队在经营、管理与产品上的思考，记录一家软件公司的成长过程。","pen-tool",{"id":46,"slug":47,"title":48,"excerpt":49,"content":9,"cover":9,"tone":10,"author":11,"publishedAt":50,"updatedAt":50,"readingMinutes":13,"featured":14,"tags":51,"category":55},51,"mvp-boundary","MVP 的边界怎么划","最小可用不是功能最少，而是能完整跑通一条业务闭环。","2026-10-03T10:13:00+08:00",[52,53,54],"MVP","产品方法","需求",{"id":56,"parentId":20,"slug":57,"name":58,"description":59,"icon":60,"cover":9,"tone":10,"kind":25,"sortOrder":61,"count":20},2,"product-thinking","产品思维","需求分析、用户体验与产品设计方法论，以及从业务问题到产品方案的思考过程。","lightbulb",50,[63,75,86],{"id":64,"slug":65,"title":66,"excerpt":67,"content":9,"cover":9,"tone":68,"author":11,"publishedAt":69,"updatedAt":69,"readingMinutes":13,"featured":14,"tags":70,"category":74},30,"integration-api-pitfalls","企业系统集成：接口对接最容易踩的五个坑","接口文档写得再全，真正对接时仍然会卡在字段约定、超时和重复推送这些细节上。","cyan","2026-10-17T09:00:00+08:00",[71,72,73],"系统集成","接口","工程实践",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":10,"kind":25,"sortOrder":26,"count":20},{"id":13,"slug":76,"title":77,"excerpt":78,"content":9,"cover":9,"tone":68,"author":11,"publishedAt":79,"updatedAt":80,"readingMinutes":56,"featured":81,"tags":82,"category":85},"why-enterprise-systems-age","为什么企业系统会在三年后开始“老化”","系统上线时功能齐全，三年后却处处别扭。问题往往不在代码，而在交付时被忽略的那些变化。","2026-10-16T09:30:00+08:00","2026-10-18T15:58:14.648+08:00",true,[83,84],"系统演进","架构设计",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":10,"kind":25,"sortOrder":26,"count":20},{"id":87,"slug":88,"title":89,"excerpt":90,"content":9,"cover":9,"tone":10,"author":11,"publishedAt":91,"updatedAt":92,"readingMinutes":56,"featured":14,"tags":93,"category":96},3,"miniapp-or-app","小程序还是 App？先看业务发生在什么场景","技术偏好不该成为选型依据。低频与高频、分享与留存、能力边界，才是决定载体的关键。","2026-09-25T09:00:00+08:00","2026-10-18T15:58:14.677+08:00",[94,95],"移动端","技术选型",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":10,"kind":25,"sortOrder":26,"count":20}]