Microsoft将某些Graph端点的速率限制为每10分钟10,000个请求(source)。如果达到限制,则Retry-After
标头指示发送另一个请求之前要等待多长时间。
这是Graph SDK自动处理的吗?如果没有,呼叫者应该采取什么步骤?
答案 0 :(得分:4)
我不认为Graph C#SDK在请求受限制时会自动重试,但是https://github.com/venkateshchepuru/aspnet-webhooks-rest-sample/blob/87b1aa4967392096d22d382b7a8848bd9c0afeea/GraphWebhooks/Helpers/GraphHttpClient.cs处有一个示例显示了429s和503s的指数退避逻辑。
此示例还遵循其他一些最佳做法-最大重试次数,日志记录请求ID和时间戳,指数补偿等。
解析标头后重试的代码:
private TimeSpan GetServerRecommendedPause(HttpResponseMessage response)
{
var retryAfter = response?.Headers?.RetryAfter;
if (retryAfter == null)
return TimeSpan.Zero;
return retryAfter.Date.HasValue
? retryAfter.Date.Value - DateTime.UtcNow
: retryAfter.Delta.GetValueOrDefault(TimeSpan.Zero);
}
确定使用重试后标头或指数补偿的代码:
if (((int)response.StatusCode == 429) || ((int)response.StatusCode == 503))
{
// Retry Only After the server specified time period obtained from the response.
TimeSpan pauseDuration = TimeSpan.FromSeconds(Math.Pow(2, attempt));
TimeSpan serverRecommendedPauseDuration = GetServerRecommendedPause(response);
if (serverRecommendedPauseDuration > pauseDuration)
{
pauseDuration = serverRecommendedPauseDuration;
}