Microsoft Graph SDK 中的默认 Retry-Handler 是否在发送请求之前检查端点是否被限制?

Does Default Retry-Handler in Microsoft Graph SDK Checks Whether the Endpoint is Throttled Before Sending the Request?

我了解 Graph SDK 实现了一个默认的重试处理程序,可以在出现 429 时负责重试。通过 RetryHandler.cs class 在 GitHub 我可以看到每个响应都在检查 429,如果有 429(请求太多) 响应,它使用 Retry-After header(如果可用)或指数 back-off 来确定任务将被延迟的时间。

对于我的问题,请考虑以下场景:

  1. 我有一个使用客户端凭证流的 azure 函数
  2. 它可以由另一个应用程序(不是用户)触发
  3. 我有一个图形服务客户端,它是静态的 object 并使用图形
  4. 其中一个请求最终被限制 (429) 并且任务被延迟
  5. 当该任务正在等待(被延迟)时,另一个请求到达使用相同图形资源的应用程序

问题:考虑到它是相同的静态 object 并且另一个任务正在延迟,Graph Service Client 是否会在不考虑端点被节流的情况下再次向 Graph 发送请求?

谢谢

无论当前挂起的受限请求或端点受限状态如何,每个请求都会发送到图形端点(它不维护任何相关状态)。 GraphClient 本质上使用 HttpClient and RetryHandler is just a http client delegating handler (concept)。此外,关于你关于静态对象的观点,它不会阻止新请求,而前一个请求正在等待重试(这就是异步任务调度派上用场的地方)。事实上,HttpClient 旨在实例化一次,re-used 贯穿应用程序的整个生命周期。为每个请求实例化一个 HttpClient class 将耗尽重负载下可用的套接字数量。这将导致 SocketException 错误。

如果服务开始节流是因为您有大量的请求(通过 GraphAPI 是为高容量设计的),您应该首先考虑重新访问您的应用程序,为什么您有如此多的 Graph API 来自应用程序的调用。如果您有可能对图形 api 的请求进行批处理,也可以考虑利用它。查看GraphAPIhttps://docs.microsoft.com/en-us/graph/throttling. Even after then, if you want to handle retry in custom way, you can use Polly which supports Circuit breaking and Bulkhead https://github.com/App-vNext/Polly

的节流指导

希望这能回答您的问题。如果您有后续问题,请告诉我。