tencent cloud

密钥管理系统

产品简介
产品概述
产品优势
应用场景
基本概念
购买指南
计费概述
购买方式
续费说明
欠费说明
控制台指南
入门概述
密钥管理
访问控制
审计
TCCLI 管理指南
操作总览
创建密钥
查看密钥
编辑密钥
启用禁用密钥
密钥轮换
对称密钥加解密
非对称密钥解密
删除密钥
实践教程
对称加解密
非对称加解密
KMS 后量子密码实践
外部密钥导入
指数回退策略应对服务限频
云产品集成 KMS 实现透明加密
API 文档
History
Introduction
API Category
Key APIs
Making API Requests
Asymmetric Key APIs
Data Types
Error Codes
服务等级协议
常见问题
一般性问题
开发接入相关问题
KMS 政策
隐私政策
数据处理和安全协议
联系我们
词汇表
文档密钥管理系统实践教程指数回退策略应对服务限频

指数回退策略应对服务限频

PDF
聚焦模式
字号
最后更新时间: 2024-01-11 16:31:21

异常处理的策略建议

请求 KMS API 接口,即应用程序的请求发送到 KMS 远程服务器时,若出现异常报错,建议您可以采用以下策略进行处理:
取消:当返回错误显示故障是非暂时性,或重新执行后也无法成功,则应当终止/取消程序调用并报告异常。
重试:当返回错误是不常见或比较少见,如网络包在传输过程中损坏,但被发送,这种情况下可以立即采取重试。
延迟重试:当返回错误是普通的连接或繁忙相关导致,则服务可能需要短时间的恢复,从而清除堆积的工作等,此类问题,等待一个合适时间后进行重试。
本文以延迟重试的策略展开说明,上述提到的等待时间(即延迟时间),可以采取逐步增加方式,或使用定时策略(如指数回退)来实现。因为调用 KMS API 接口服务会限制频率,所以当您调用的并发过高时,可以采用延迟重试的方法来避免限频所带来的问题。

指数回退

伪代码

//使用逐步增加的方式来延迟重试某个操作
InitDelayValue = 100
For(Retries = 0; Retries < MAX_RETRIES; Retries = Retries+1)
wait for (2^Retries * InitDelayValue) milliseconds
Status = KmsApiRequest()
IF Status == SUCCESS
BREAK // Succeeded, stop calling the API again.
ELSE IF Status = THROTTLED || Status == SERVER_NOT_READY
CONTINUE // Failed due to throttling or server busy, try again.
ELSE
BREAK // another error occurs, stop calling the API again.
END IF

策略运用

Python 示例:调用 KMS Encrypt 接口遇到限频错误时,如何使用指数回退方法处理
# -*- coding: utf-8 -*-
import base64
import math
import time
from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.kms.v20190118 import kms_client, models


def KmsInit(region="ap-guangzhou", secretId="", secretKey=""):
try:
credProfile = credential.Credential(secretId, secretKey)
client = kms_client.KmsClient(credProfile, region)
return client
except TencentCloudSDKException as err:
print(err)
return None

def BackoffFunction(RetryCount):
InitDelayValue = 100
DelayTime = math.pow(2, RetryCount) * InitDelayValue
return DelayTime

if __name__ == '__main__':
# 用户自定义参数
secretId = "replace-with-real-secretId"
secretKey = "replace-with-real-secretKey"
region = "ap-guangzhou"
keyId = "replace-with-realkeyid"
plaintext = "abcdefg123456789abcdefg123456789abcdefg"
Retries = 0
MaxRetries = 10
client = KmsInit(region, secretId, secretKey)
req = models.EncryptRequest()
req.KeyId = keyId
req.Plaintext = base64.b64encode(plaintext)
while Retries < MaxRetries:
try:
Retries += 1
rsp = client.Encrypt(req) # 调用加密接口
print 'plaintext: ',plaintext,'CiphertextBlob: ',rsp.CiphertextBlob
break
except TencentCloudSDKException as err:
if err.code == 'InternalError' or err.code == 'RequestLimitExceeded':
if Retries == MaxRetries:
break
time.sleep(BackoffFunction(Retries + 1))
continue
else:
print(err)
break
except Exception as err:
print(err)
break
注意:
如需解决其他特定的错误,您可以直接对 except 语句的内容做更改、调整即可。
根据自己的代码逻辑、业务策略等,进行定时策略的规划与制定,从而设置最优的初始延迟值(InitDelayValue)及重试次数(Retries),避免阈值设置过低或过高,影响整体业务运转。

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈