如何保證冪等性
您在調(diào)用彈性伸縮的API時(shí),如果發(fā)生請(qǐng)求超時(shí)或服務(wù)器內(nèi)部錯(cuò)誤,客戶端可能會(huì)嘗試重發(fā)請(qǐng)求。您可以在請(qǐng)求中設(shè)置ClientToken參數(shù)避免多次重試帶來重復(fù)操作的問題。
什么是冪等性
在數(shù)學(xué)計(jì)算或者計(jì)算機(jī)科學(xué)中,冪等性(idempotence)是指相同操作或資源在一次或多次請(qǐng)求中具有同樣效果的作用。冪等性是在分布式系統(tǒng)設(shè)計(jì)中具有十分重要的地位。
保證冪等性
通常情況下,客戶端只需要在500(InternalError
)或503(ServiceUnavailable
)錯(cuò)誤,或者無法獲取響應(yīng)結(jié)果時(shí)重試。使用阿里云彈性伸縮的API,您可以從客戶端生成一個(gè)參數(shù)值不超過64個(gè)的ASCII字符,并將值賦予ClientToken,保證重試請(qǐng)求的冪等性。
ClientToken詳解
ClientToken是一個(gè)由客戶端生成的唯一的、區(qū)分大小寫、不超過64個(gè)ASCII字符的字符串。例如,
ClientToken=123e4567-e89b-12d3-a456-42665544****
。如果您提供了一個(gè)已經(jīng)使用過的ClientToken,但其他請(qǐng)求參數(shù)有變化,則彈性伸縮會(huì)返回
IdempotentParameterMismatch
的錯(cuò)誤代碼。說明參數(shù)SignatureNonce、Timestamp和Signature在重試時(shí)是需要變化的。具體原因是彈性伸縮使用SignatureNonce防止重放攻擊,使用Timestamp標(biāo)記每次請(qǐng)求時(shí)間。所以再次請(qǐng)求必須提供不同的SignatureNonce和Timestamp參數(shù)值,同時(shí)也會(huì)導(dǎo)致Signature值的變化。
添加了ClientToken參數(shù)后:
返回結(jié)果是200 HTTPCode時(shí),重試后客戶端可以得到與上次相同的結(jié)果,但對(duì)您的服務(wù)端狀態(tài)沒有影響。
返回結(jié)果是4xx HTTPCode時(shí),如果錯(cuò)誤信息沒有表明
try it later
類似的信息,重試不會(huì)成功。您需要根據(jù)錯(cuò)誤信息排查問題后再重試請(qǐng)求。
冪等請(qǐng)求示例
以CreateScalingGroup創(chuàng)建一個(gè)伸縮組為例,如果您使用同一個(gè)ClientToken值,其他請(qǐng)求參數(shù)相同時(shí),則服務(wù)端會(huì)返回相同的請(qǐng)求結(jié)果,只會(huì)產(chǎn)生一個(gè)ScalingGroupId。
http(s)://ess.aliyuncs.com/?Action=CreateScalingGroup
&ScalingGroupName=scalinggroup****
&InstanceId=i-28wt4****
&RegionId=cn-qingdao
&MinSize=2
&MaxSize=20
&DefaultCooldown=300
.......
&ClientToken=123e4567-e89b-12d3-a456-42665544****
&<公共請(qǐng)求參數(shù)>
API列表
以下為部分包含了ClientToken參數(shù)的API,供您參考。具體哪些API支持ClientToken參數(shù)請(qǐng)以各API文檔為準(zhǔn),此處不一一列舉。
創(chuàng)建一個(gè)伸縮組:CreateScalingGroup
創(chuàng)建一個(gè)ECS類型的伸縮配置:CreateScalingConfiguration
從一個(gè)伸縮組刪除一臺(tái)或多臺(tái)ECS實(shí)例:RemoveInstances
執(zhí)行一條伸縮規(guī)則:ExecuteScalingRule
添加一個(gè)或多個(gè)RDS實(shí)例:AttachDBInstances
從伸縮組添加一個(gè)或多個(gè)負(fù)載均衡服務(wù)器組:AttachServerGroups
添加一個(gè)或多個(gè)負(fù)載均衡實(shí)例:AttachLoadBalancers
向伸縮組添加一個(gè)或多個(gè)ALB服務(wù)器組:AttachAlbServerGroups
添加負(fù)載均衡實(shí)例下的一個(gè)或者多個(gè)虛擬服務(wù)器組:AttachVServerGroups