[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-idempotent-design-basics-en":3,"blog-adjacent-idempotent-design-basics-en":28,"blog-related-idempotent-design-basics-en":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","Idempotency: Duplicate Submissions Are Not Just Double Clicks","Retries, redelivery and impatient users all send the same request more than once. Idempotency belongs in the API design.","\u003Cp>Any team that has built payments has met a double charge. The visible cause is a user clicking twice; the real cause is an interface that cannot tell a second request from a new one.\u003C\u002Fp>\n\u003Ch2>Where duplicates come from\u003C\u002Fh2>\n\u003Cp>Double clicks are the simplest case. Disabling the button covers most of them, but not retries at the network layer.\u003C\u002Fp>\n\u003Cp>Gateway resends after timeouts, at-least-once message delivery and reruns of compensation jobs are all routine on the server side.\u003C\u002Fp>\n\u003Cp>On weak mobile networks a request may arrive while the response is lost, and the user will submit again.\u003C\u002Fp>\n\u003Ch2>Three implementations\u003C\u002Fh2>\n\u003Cp>A business unique key plus a database unique index: order number, serial or a client-generated request id. Duplicates are rejected outright.\u003C\u002Fp>\n\u003Cp>State machine validation: only records in a given state can advance, and completed operations return the previous result.\u003C\u002Fp>\n\u003Cp>A deduplication table storing request id and outcome, useful across service boundaries.\u003C\u002Fp>\n\u003Cp>Idempotency is not an optional optimisation; it is part of the interface contract. One extra thought at design time saves one reconciliation later.\u003C\u002Fp>","","blue","佳益方圆团队","2026-10-05T10:13:00+08:00",1,false,[16,17,18],"API Design","Idempotency","Reliability",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":10,"kind":25,"sortOrder":26,"count":20},0,"engineering","Engineering","Hands-on engineering practices in architecture, performance optimization, AI integration and cross-platform delivery from our R and D team.","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","Why We Quote by Scope, Not by Man-Days","Man-day pricing looks fair, but it pushes every uncertainty onto the client. We would rather agree on scope and assumptions first, then talk about money.","2026-10-07T09:00:00+08:00",[36,37,38],"Startup","Pricing","Partnership",{"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","Founder Notes","Reflections from the founding team on business, management and product, documenting the growth of a software company.","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","Drawing the Boundary of an MVP","Minimum viable is not the fewest features; it is one complete business loop running end to end.","2026-10-03T10:13:00+08:00",[52,53,54],"MVP","Product","Requirements",{"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","Product Thinking","Requirement analysis, user experience and product design methods, plus the thinking from business problems to product solutions.","lightbulb",50,[63,74,85],{"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":73},30,"integration-api-pitfalls","Five Traps in Enterprise System Integration","However complete the API documentation is, integration usually stalls on field semantics, timeouts and repeated pushes.","cyan","2026-10-17T09:00:00+08:00",[71,72,22],"Integration","APIs",{"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":75,"title":76,"excerpt":77,"content":9,"cover":9,"tone":68,"author":11,"publishedAt":78,"updatedAt":79,"readingMinutes":56,"featured":80,"tags":81,"category":84},"why-enterprise-systems-age","Why Enterprise Systems Start to Age After Three Years","A system can pass acceptance with every feature checked, then feel awkward three years later. The problem is rarely the code — it is the changes that were never considered at delivery.","2026-10-16T09:30:00+08:00","2026-10-18T15:58:14.648+08:00",true,[82,83],"System Evolution","Architecture",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":10,"kind":25,"sortOrder":26,"count":20},{"id":86,"slug":87,"title":88,"excerpt":89,"content":9,"cover":9,"tone":10,"author":11,"publishedAt":90,"updatedAt":91,"readingMinutes":13,"featured":14,"tags":92,"category":95},3,"miniapp-or-app","Mini Program or App? Start with Where the Business Happens","Technical preference should not decide the platform. Frequency, sharing, retention and capability boundaries are what really determine the right carrier.","2026-09-25T09:00:00+08:00","2026-10-18T15:58:14.677+08:00",[93,94],"Mobile","Technology Selection",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":10,"kind":25,"sortOrder":26,"count":20}]