作者:季雨林 來源:https://www.opengps.cn/Blog/View.aspx?id=426
關(guān)于怎么實(shí)現(xiàn)承載更多用戶量的系統(tǒng),一直是我重點(diǎn)關(guān)注的一個技術(shù)方向。改造架構(gòu)提高承載力,通常來講分為兩個大方向,互相配合實(shí)現(xiàn)。
硬件架構(gòu)改進(jìn),主要是使用阿里云這種多組件的云環(huán)境:通過負(fù)載均衡SLB,模版克隆的云服務(wù)器ECS,云數(shù)據(jù)庫RDS,共享對象存儲OSS等不同職責(zé)的云產(chǎn)品組合實(shí)現(xiàn)。
軟件架構(gòu)優(yōu)化,主要是軟件代碼開發(fā)的規(guī)范:業(yè)務(wù)解耦合,架構(gòu)微服務(wù),單機(jī)無狀態(tài)化,文件存儲共享等
在分布式系統(tǒng)的學(xué)習(xí)途中也不斷見識新的知識點(diǎn),今天要說的就是軟件開發(fā)時候?qū)τ诮涌诜?wù)的“冪等性”實(shí)現(xiàn)!
# 冪等性
效果:系統(tǒng)對某接口的多次請求,都應(yīng)該返回同樣的結(jié)果!(網(wǎng)絡(luò)訪問失敗的場景除外)
目的:避免因?yàn)楦鞣N原因,重復(fù)請求導(dǎo)致的業(yè)務(wù)重復(fù)處理

# 重復(fù)請求場景案例:
1,客戶端第一次請求后,網(wǎng)絡(luò)異常導(dǎo)致收到請求執(zhí)行邏輯但是沒有返回給客戶端,客戶端的重新發(fā)起請求
2,客戶端迅速點(diǎn)擊按鈕提交,導(dǎo)致同一邏輯被多次發(fā)送到服務(wù)器
簡單來劃分,業(yè)務(wù)邏輯無非都可以歸納為增刪改查!
對于查詢,內(nèi)部不包含其他操作,屬于只讀性質(zhì)的那種業(yè)務(wù)必然符合冪等性要求的。
對于刪除,重復(fù)做刪除請求至少不會造成數(shù)據(jù)雜亂,不過也有些場景更希望重復(fù)點(diǎn)擊提示的是刪除成功,而不是目標(biāo)不存在的提示。
對于新增和修改,這里是今天要重點(diǎn)關(guān)注的部分:新增,需要避免重復(fù)插入;修改,避免進(jìn)行無效的重復(fù)修改;
# 冪等性的實(shí)現(xiàn)方式
實(shí)現(xiàn)方法:客戶端做某一請求的時候帶上識別參數(shù)標(biāo)識,服務(wù)端對此標(biāo)識進(jìn)行識別,重復(fù)請求則重復(fù)返回第一次的結(jié)果即可。
舉個栗子:比如添加請求的表單里,在打開添加表單頁面的時候,就生成一個AddId標(biāo)識,這個AddId跟著表單一起提交到后臺接口。
后臺接口根據(jù)這個AddId,服務(wù)端就可以進(jìn)行緩存標(biāo)記并進(jìn)行過濾,緩存值可以是AddId作為緩存key,返回內(nèi)容作為緩存Value,這樣即使添加按鈕被多次點(diǎn)下也可以識別出來。這個AddId什么時候更新呢?只有在保存成功并且清空表單之后,才變更這個AddId標(biāo)識,從而實(shí)現(xiàn)新數(shù)據(jù)的表單提交。