阿里面試官:接口的冪等性怎么設(shè)計?

一、什么是冪等?

二、使用冪等的場景
1、前端重復(fù)提交
2、接口超時重試
3、消息重復(fù)消費(fèi)
三、解決方案
1、token 機(jī)制實現(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é)

好文推薦

10個程序員副業(yè)賺錢路子,月收入增加2萬!

編程大佬是否能記住代碼,不用百度就能啪啪啪敲出來么?

你為什么不敢重構(gòu)代碼?
一鍵三連「分享」、「點(diǎn)贊」和「在看」
技術(shù)干貨與你天天見~
評論
圖片
表情
