您在調用ECS API時,如果發生請求逾時或伺服器內部錯誤,用戶端可能會嘗試重發請求。您可以在請求中設定ClientToken參數來確保請求完成的次數不超過一次,以此避免多次重試帶來重複操作的問題。
什麼是等冪性
在數學計算或者電腦科學中,等冪性(idempotence)是指相同操作或資源在一次或多次請求中具有同樣效果的作用。等冪性是在分布式系統設計中具有十分重要的地位。
保證等冪性
通常情況下,用戶端只需要在500(InternalError
)或503(ServiceUnavailable
)錯誤,或者無法擷取響應結果時重試。使用阿里雲ECS API,您可以從用戶端產生一個參數值不超過64的ASCII字元,並將值賦予ClientToken,保證重試請求的等冪性。
ClientToken詳解
ClientToken參數的詳細資料如下所示。
ClientToken是一個由用戶端產生的唯一的、大小寫敏感、不超過64個ASCII字元的字串。例如,
ClientToken=123e4567-e89b-12d3-a456-426655440000
。當您使用了一個已經使用過的ClientToken,同時請求中的其他參數有變化,ECS會返回
IdempotentParameterMismatch
的錯誤碼,導致請求失敗。此時,建議您更換ClientToken的值然後重試。當您使用了一個已經使用過的ClientToken,其他請求參數無變化,那麼重複提交該請求後,用戶端將收到與首次提交相同的結果,對您的服務端狀態沒有影響。
說明參數SignatureNonce、Timestamp和Signature在重試時是需要變化的。具體原因是ECS使用簽名隨機數SignatureNonce,確保每次請求都是唯一的,防止重放攻擊。使用時間戳Timestamp,標記每次請求發起的時間。因此,再次請求必須提供不同的SignatureNonce和Timestamp參數值,同時也會導致Signature值的變化。
添加了ClientToken參數後:
返回結果是200 HTTPCode時,重試後用戶端可以得到與上次相同的結果,但對您的服務端狀態沒有影響。
返回結果是4xx HTTPCode時,如果錯誤資訊沒有
try it later
類似的資訊,重試不會成功。您需要根據錯誤資訊排查問題後再重試請求。
等冪請求樣本
以RunInstance建立一台ECS執行個體為例,如果您使用同一個ClientToken值,其他請求參數相同時,則服務端會返回相同的請求結果,只會產生一個InstanceId。在遇到因執行個體規格庫存不足等問題導致執行個體建立失敗時,待庫存充足後建議您更換ClientToken值後建立執行個體。
https://ecs.aliyuncs.com/?Action=RunInstances
&RegionId=cn-hangzhou
&InstanceType=ecs.cm4.6xlarge
&ImageId=win2008r2_64_ent_sp1_en-us_40G_alibase_20170915.vhd
&SecurityGroupId=sg-securitygroupid
&Amount=1
.......
&ClientToken=123e4567-e89b-12d3-a456-426655440000
&<公用請求參數>
如果您不使用ClientToken,在報錯重試時,可能會建立多台ECS執行個體。
API列表
以下為部分包含了ClientToken參數的API,供您參考。具體哪些API支援ClientToken參數請以各API文檔為準,此處不一一列舉。