阿里面試官:接口的冪等性怎么設(shè)計?
點擊藍(lán)色“黃小斜學(xué)Java”關(guān)注我喲
加個“星標(biāo)”,每天和你一起多進(jìn)步一點點!
一、什么是冪等?

二、使用冪等的場景
1、前端重復(fù)提交
2、接口超時重試
3、消息重復(fù)消費
三、解決方案
1、token 機制實現(xiàn)

客戶端會先發(fā)送一個請求去獲取 token,服務(wù)端會生成一個全局唯一的 ID 作為 token 保存在 redis 中,同時把這個 ID 返回給客戶端 客戶端第二次調(diào)用業(yè)務(wù)請求的時候必須攜帶這個 token 服務(wù)端會校驗這個 token,如果校驗成功,則執(zhí)行業(yè)務(wù),并刪除 redis 中的 token 如果校驗失敗,說明 redis 中已經(jīng)沒有對應(yīng)的 token,則表示重復(fù)操作,直接返回指定的結(jié)果給客戶端
對 redis 中是否存在 token 以及刪除的代碼邏輯建議用 Lua 腳本實現(xiàn),保證原子性 全局唯一 ID 可以用百度的 uid-generator、美團(tuán)的 Leaf 去生成
2、基于 mysql 實現(xiàn)

建立一張去重表,其中某個字段需要建立唯一索引 客戶端去請求服務(wù)端,服務(wù)端會將這次請求的一些信息插入這張去重表中 因為表中某個字段帶有唯一索引,如果插入成功,證明表中沒有這次請求的信息,則執(zhí)行后續(xù)的業(yè)務(wù)邏輯 如果插入失敗,則代表已經(jīng)執(zhí)行過當(dāng)前請求,直接返回
3、基于 redis 實現(xiàn)

客戶端先請求服務(wù)端,會拿到一個能代表這次請求業(yè)務(wù)的唯一字段 將該字段以 SETNX 的方式存入 redis 中,并根據(jù)業(yè)務(wù)設(shè)置相應(yīng)的超時時間 如果設(shè)置成功,證明這是第一次請求,則執(zhí)行后續(xù)的業(yè)務(wù)邏輯 如果設(shè)置失敗,則代表已經(jīng)執(zhí)行過當(dāng)前請求,直接返回
總結(jié)
— 【 THE END 】— 本公眾號全部博文已整理成一個目錄,請在公眾號里回復(fù)「m」獲取! 最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
獲取方式:點“在看”,關(guān)注公眾號并回復(fù) PDF 領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
文章有幫助的話,在看,轉(zhuǎn)發(fā)吧。
謝謝支持喲 (*^__^*)
評論
圖片
表情
