3毫秒之内一个订单重复提交两次,java后台怎么防止订单重复提交?跪求大神解惑?
在电商面试的高频挑战中,如何在3毫秒内防范订单的重复提交?这个问题看似简单,实则考验着开发者的深思熟虑。在瞬息万变的秒杀场景之外,防止重复下单已经成为了一道必答题。
重复提交的现象主要源于两方面:一是用户快速点击下单或刷新,二是Nginx或SpringCloud Gateway的网关层在超时后自动重试。解决之道在于理解接口的幂等性原则。
幂等性,即多次相同的请求应得到相同的结果。例如,修改用户姓名的操作是幂等的,但增加年龄则不然。在防止重复提交的场景中,我们需要找到一个能在高并发下保持一致性的策略。
首先,简单粗暴的策略是按钮置灰,但这只能应对点击事件,对网关重试无效。真正的解决方案需要更深入地考虑接口设计。比如,预生成全局唯一订单号是常见的方法:
- 后端提供接口生成订单ID,如UUID或NanoID。
- 前端在创建订单时获取并传递此ID,利用数据库的唯一索引避免重复插入。
尽管这种方法确保了订单唯一,但增加了开发复杂性和数据表结构。
另一种方案是简化前端生成订单ID,但同样需要前端和后端的配合。然而,从订单业务本质出发,我们找到了一个更优雅的解决方案:
- 利用用户ID和商品ID的组合,形成独特的标识。
- 通过Redis实现短时锁定,防止短时间内重复提交,过期则解锁。
这种方法无需额外接口和字段,而且Redis的使用使技术选型更为简洁。
在实际生产环境中,我们选择方案四,因为它最小化了改动范围,测试回归易于控制,且符合百度倡导的“简单可依赖”原则。在面对挑战时,理解业务本质并巧妙运用技术手段,是防止订单重复提交的关键。
绛旓細閲嶅鎻愪氦鐨勭幇璞′富瑕佹簮浜庝袱鏂归潰锛涓鏄敤鎴峰揩閫熺偣鍑讳笅鍗曟垨鍒锋柊锛屼簩鏄疦ginx鎴朣pringCloud Gateway鐨勭綉鍏冲眰鍦ㄨ秴鏃跺悗鑷姩閲嶈瘯銆傝В鍐充箣閬撳湪浜庣悊瑙f帴鍙g殑骞傜瓑鎬у師鍒欍傚箓绛夋э紝鍗冲娆$浉鍚岀殑璇锋眰搴斿緱鍒扮浉鍚岀殑缁撴灉銆備緥濡傦紝淇敼鐢ㄦ埛濮撳悕鐨勬搷浣滄槸骞傜瓑鐨勶紝浣嗗鍔犲勾榫勫垯涓嶇劧銆傚湪闃叉閲嶅鎻愪氦鐨勫満鏅腑锛屾垜浠渶瑕佹壘鍒颁竴涓兘鍦...
绛旓細2.璁剧疆HTTP鎶ュご锛屾帶鍒惰〃鍗曠紦瀛橈紝浣垮緱鎵鎺у埗鐨勮〃鍗曚笉缂撳瓨淇℃伅锛岃繖鏍风敤鎴峰氨鏃犳硶閫氳繃閲嶅鐐瑰嚮鎸夐挳鍘婚噸澶嶆彁浜よ〃鍗銆 浣嗘槸杩欐牱鍋氫篃鏈夊眬闄愭э紝鐢ㄦ埛鍦ㄦ彁浜ら〉闈㈢偣鍑诲埛鏂颁篃浼氶犳垚琛ㄥ崟鐨勯噸澶嶆彁浜ゃ3.閫氳繃PRG璁捐妯″紡(鐢ㄦ潵闃叉F5鍒锋柊閲嶅鎻愪氦琛ㄥ崟):PRG妯″紡閫氳繃鍝嶅簲椤甸潰Header杩斿洖HTTP鐘舵佺爜杩涜椤甸潰璺宠浆鏇夸唬鍝嶅簲椤甸潰璺宠浆杩囩▼銆...
绛旓細瑕佸疄鐜癊xaclty Once鍗宠繖涓秷鎭彧琚秷璐逛竴娆(骞朵笖鑲畾瑕佷繚璇佽兘娑堣垂涓娆),鎴戜滑鍙互杩欐牱鍋:鍦ㄨ繖涓暟鎹簱涓鍔涓涓娑堟伅娑堣垂璁板綍琛,鎶婃秷鎭彃鍏ュ埌杩欎釜琛,骞朵笖鎶婂師鏉ョ殑璁㈠崟鏇存柊鍜岃繖涓彃鍏ョ殑鍔ㄤ綔鏀惧埌鍚屼竴涓簨鍔′腑涓璧鎻愪氦,灏辫兘淇濊瘉娑堟伅鍙細琚秷璐逛竴閬嶄簡銆 1銆佸紑鍚簨鍔 2銆佹彃鍏ユ秷鎭〃(澶勭悊濂戒富閿啿绐佺殑闂) 3銆佹洿鏂拌鍗...
绛旓細鍦ㄩ珮宄版椂娈碉紝缃戠珯姣忕鍞嚭杞︾エ杩700寮狅紝鑰屼竴鍒楁櫘閫氬姩杞︾粍鐨勪箻瀹㈡绘暟涔熷氨鏄600浜哄乏鍙筹紝鎵浠ュ嚭鐜伴儴鍒嗚溅娆$鍏夌殑鐜拌薄鏄甯哥殑銆傜敤鎴锋煡鍒版湁绁ㄥ悗濉啓涔樿溅浜轰俊鎭紝鍦ㄧ偣鍑鎻愪氦鎸夐挳鐨勬椂鍊欏氨寮濮嬫帓闃燂紝鎸夋椂闂撮『搴忓嚭绁ㄣ1绉掗挓鍐鍙兘鏈夊緢澶氫汉鎻愪氦锛屽尯鍒嗙殑鏃堕棿浼氬叿浣撳埌姣銆傚彟澶栨姠绁ㄧ殑鏃呭闈炲父澶氾紝浣欑エ涔熷湪瀹炴椂鍙樺寲銆...
绛旓細.瀛愮▼搴 __鍚姩绐楀彛_鍒涘缓瀹屾瘯鏃堕挓1.鏃堕挓鍛ㄦ湡 = 180000 ' 榛樿鏄姣1000涓1绉,60000涓1鍒嗛挓.瀛愮▼搴 _鏃堕挓1_鍛ㄦ湡浜嬩欢, , , 杈撳叆鎮ㄦ兂鎵ц鐨勪簨浠跺嵆鍙 鏈洖绛旂敱鐢佃剳缃戠粶鍒嗙被杈句汉 鍒樿仾鑱帹鑽 涓炬姤| 绛旀绾犻敊 | 璇勮 3 1 discovery522 閲囩撼鐜:77% 鏉ヨ嚜鍥㈤槦:鏄撹瑷鎶鏈 鎿呴暱: 鏁板 鏁欒偛/绉戝 ...
绛旓細鍦ㄨ喘绁ㄦ椂锛岀敤鎴锋煡鍒版湁绁ㄥ悗濉啓涔樿溅浜轰俊鎭紝鍦ㄧ偣鍑鎻愪氦鎸夐挳鐨勬椂鍊欏氨寮濮嬫帓闃燂紝鎸夋椂闂撮『搴忓嚭绁ㄣ1绉掗挓鍐鍙兘鏈夊緢澶氫汉鎻愪氦锛屽尯鍒嗙殑鏃堕棿浼氬叿浣撳埌姣銆傜綉涓婅喘涔扮伀杞︾エ鐨勮瀹氥傘婇搧璺簰鑱旂綉鍞エ鏆傝鍔炴硶銆嬬鍏潯鍦ㄧ綉绔欒喘涔伴搧璺數瀛愬绁ㄦ椂锛屽簲褰撴敞鍐屽苟鍑嗙‘鎻愪緵涔樿溅浜虹殑鏈夋晥韬唤璇佷欢淇℃伅銆傜涓冩潯鍦ㄧ綉绔欒喘绁ㄥ彲浣跨敤鐨...
绛旓細绉掓潃婧愯嚜鍔ㄨ瘑鍒獙璇佺爜 涓洪槻姝㈡伓鎰忔煡璇佸悲绁ㄧ瓑琛屼负锛12306鍦ㄦ暣涓绁ㄨ繃绋嬩腑璁剧疆涓瀹氶檺鍒跺拰瑙勮寖锛屽寘鎷涓ゆ璐エ鏌ヨ鐨勮繃绋嬩笉鑳戒綆浜5绉掞紝鐧诲綍鍜鎻愪氦璁㈠崟鏃堕兘璁剧疆楠岃瘉鐮佺瓑銆傛嵁涓瀹舵妧鏈叕鍙告祻瑙堝櫒鎶鏈汉鍛樹粙缁嶏紝榛勭墰鐢ㄧ殑鎶㈢エ杞欢鍒欐槸鑷姩璇嗗埆楠岃瘉鐮侊紝杞欢浠姣閫熷害鑷姩璇嗗埆骞惰嚜鍔ㄨ緭鍏ワ紝姣旀墜鍔ㄨ緭鍏ュ揩鏁板嶃傚悓鏃舵绫...
绛旓細涓鍒锋柊锛屽彲鑳藉氨鎵句笉鍒拌嚜宸辫涔扮殑浜嗐傛渶濂界殑鏂瑰紡鏄紝璐墿杞︿腑鍙繚鐣欎竴瀹跺簵锛岀劧鍚庨浂鐐逛竴杩囷紝绔嬪嵆鍒锋柊锛屽苟鎻愪氦璁㈠崟銆3銆佸簵閾轰腑涓烘暟涓嶅鐨勫晢鍝佹殏鏃跺氨涓嶈涔颁簡锛屽洜涓洪浂鐐逛竴杩囷紝鍙兘浼氭湁寰堝浜轰拱鍚屼竴鍟嗗搧锛屽鏋滄鏃跺晢鍝佹病鏈変簡锛屽彲鑳戒細鎵颁贡鏁翠釜璁″垝銆傛殏鏃跺氨鎯冲埌杩欎箞澶氾紝濡傛灉鏈変笉瀵圭殑鍦版柟锛屾杩庢寚姝o紒
绛旓細鍥炵瓟锛氬悜鏈嶅姟鍣ㄨ姹涓涓璧勬簮銆傚鏋滀笉杩涜澶勭悊,璁稿璇锋眰灏嗗湪澶氭鍗曞嚮涔嬪悗绛夊緟銆傜矖鐣ョ殑瑙e喅鏂规鏄竴娆℃х鐢ㄦ寜閽傝闂,浣犳湁娌℃湁鏇村ソ鐨勫姙娉,姣斿鍦ㄦ帴鍒拌姹傚悗鑷姩鍋滄満? 鍙槸鐪嬬湅Gmail Firebug鍜屽彂鐜颁互鍓嶇殑璇锋眰鐨勭姸鎬佹敼涓衡滀腑姝⑩濇椂,涓鍐嶈姹備笅琚彂鐜,骞舵病鏈夎繑鍥炰换浣曟暟鎹傝闂綘鏄庝箞鍋氱殑?姣曠珶,涓鑸兘鐭ラ亾...
绛旓細浜戣处鎴锋槸涓涓鍦ㄧ嚎璐︽埛鏈嶅姟鎻愪緵鍟嗭紝鎻愪緵鍏ㄩ潰鐨勫湪绾胯处鎴疯В鍐虫柟妗堬紝浠ユ弧瓒充笉鍚屽鎴风殑闇姹傘備簯璐︽埛鐨勭绾︽祦绋嬬畝鍗曞揩鎹凤紝鍙互蹇熷垱寤鸿处鎴凤紝骞朵笖鏀寔澶氱鏀粯鏂瑰紡銆備簯璐︽埛鑷村姏浜庢彁渚涙渶浼樿川鐨勬湇鍔★紝浠ユ弧瓒冲鎴风殑闇姹傘備簯璐︽埛杩橀噰鐢ㄦ櫤鑳借矾鐢辩郴缁燂紝鏅鸿兘璇嗗埆澶氭鎻愪氦鐨勭浉鍚璁㈠崟锛岄槻姝閲嶅浠樻锛屽疄鐜姣绾у搷搴斻