Содержание
За последние несколько месяцев я получил множество запросов от клиентов о том, как избежать дросселирования Microsoft Graph API и вообще как оптимизировать сетевой трафик для Graph API.
Как работает дросселирование Microsoft Graph
Дросселирование - это механизм, который Microsoft Graph использует для предотвращения чрезмерного использования ресурсов и поддержания работоспособности службы. Когда приложение делает слишком много запросов за короткий промежуток времени или превышает лимиты службы для определенных ресурсов или операций, Microsoft Graph может ограничить или заблокировать любые дальнейшие запросы от этого приложения на определенный период времени. В этом случае Microsoft Graph возвращает код состояния HTTP 429 (Слишком много запросов), а также заголовок Retry-After, указывающий, сколько времени приложение должно ждать, прежде чем повторить запрос.
Поведение дросселирования может зависеть от различных факторов, таких как тип запроса (GET, POST, PATCH и т. д.), масштаб ограничения (на приложение, на арендатора, на пользователя и т. д.), задействованная служба или ресурс (Outlook, OneDrive, Teams и т. д.), а также текущая нагрузка и состояние службы. Поэтому невозможно точно предсказать, когда и как произойдет дросселирование для конкретного приложения.
Как избежать дросселирования
Лучший способ избежать дросселирования - разработать приложение таким образом, чтобы минимизировать количество и частоту запросов к Microsoft Graph API. Вот несколько лучших практик, которые вы можете применить для достижения этой цели:
- Применяйте принцип наименьших привилегий. Запрашивайте только те разрешения, которые необходимы вашему приложению для выполнения его функций, и используйте наименее привилегированный тип разрешения для каждого сценария. Например, если вашему приложению нужно только прочитать профиль вошедшего пользователя, запросите делегированное разрешение User.Read вместо разрешений User.ReadBasic.All или User.Read.All. Это уменьшит влияние вашего приложения на службу и другие приложения или арендаторов.
- Используйте пакетную обработку. Если вашему приложению необходимо выполнить несколько запросов к Microsoft Graph API, воспользуйтесь функцией [JSON batching], чтобы объединить их в один запрос. Это сократит количество HTTP-соединений и повысит эффективность работы сети. Вы можете объединить до 20 запросов в один пакетный запрос, если они не являются взаимозависимыми и их размер не превышает 20 КБ.
- Используйте пагинацию. Если вашему приложению необходимо получить большой объем данных из Microsoft Graph API, например список пользователей или сообщений, воспользуйтесь функцией [пагинации], чтобы получать данные небольшими фрагментами, а не запрашивать их все сразу. Это позволит снизить нагрузку на службу и избежать таймаутов или неполных ответов. Вы можете использовать параметр запроса top, чтобы указать размер страницы (до 1000 элементов на страницу), и использовать свойство nextLink или deltaLink в ответе, чтобы получить следующую страницу или дельту изменений.
- Используйте фильтрацию, сортировку и проекцию. Если вашему приложению требуется только подмножество данных или определенный порядок данных из Microsoft Graph API, используйте функции [фильтрация], [сортировка] и [проекция], чтобы уменьшить объем данных, возвращаемых службой. Это повысит производительность и пропускную способность вашего приложения. Вы можете использовать параметр запроса filter для применения логических операторов или функций к свойствам ресурсов, использовать параметр запроса orderby для сортировки результатов по одному или нескольким свойствам, а также использовать параметр запроса select для указания в ответе только тех свойств, которые вам нужны.
- Получайте только ту информацию, которая вам нужна**. Если вашему приложению нужны только два или три поля для сущности, используйте параметр [select], чтобы получить только эти поля. Это сократит время ответа и, конечно, сетевой трафик.
Как реализовать стратегии дросселирования
Даже если вы следуете приведенным выше лучшим практикам, все равно существует вероятность того, что ваше приложение может столкнуться с дросселированием Microsoft Graph API по различным причинам, не зависящим от вас. Поэтому важно реализовать некоторые стратегии в коде приложения, чтобы изящно справляться с дросселированием и должным образом повторять неудачные запросы. Вот некоторые стратегии, которые вы можете реализовать:
- Использование экспоненциального отката. Когда ваше приложение получает ответ 429 от Microsoft Graph API, оно должно подождать в течение времени, указанного в заголовке Retry-After, прежде чем повторить запрос. Однако, поскольку нет гарантии, что запрос будет успешным по истечении этого времени, рекомендуется использовать алгоритм экспоненциального отката, чтобы увеличивать время ожидания по экспоненте после каждого последующего отказа.e, вплоть до максимального предела. Это уменьшит вероятность перегрузки службы и повысит вероятность успеха. Вы также можете добавить некоторую случайность или дрожание во время ожидания, чтобы избежать проблем с синхронизацией с другими приложениями или запросами.
- Используйте адаптивное дросселирование. В некоторых случаях ваше приложение может не получать 429 ответ от Microsoft Graph API, но при этом испытывать некоторые признаки дросселирования, такие как повышенная задержка, неполные результаты или ошибки службы. Это может указывать на то, что служба испытывает высокую нагрузку или ухудшение работоспособности и применяет некоторые адаптивные механизмы дросселирования, чтобы справиться с ситуацией. В этом случае ваше приложение должно следить за производительностью и качеством ответов и соответствующим образом регулировать частоту запросов. Например, вы можете использовать заголовки [Retry-After] или [X-Ms-Retry-After-Ms], заголовки [X-Ms-Resource-Quota] и [X-Ms-Resource-Usage] или заголовок [Diagnostics], чтобы получить некоторые подсказки о состоянии службы и рекомендуемых действиях.
- Используйте Microsoft Graph SDKs. Если вы используете один из [Microsoft Graph SDKs] для доступа к Microsoft Graph API, вы можете воспользоваться некоторыми встроенными функциями, которые автоматически обрабатывают дросселирование или предоставляют некоторые опции для настройки политики повторных попыток. Например, в Microsoft Graph SDK для .NET есть [RetryHandler] промежуточное программное обеспечение, которое реализует экспоненциальный алгоритм отката с джиттером и уважает заголовок Retry-After. Вы также можете настроить количество повторных попыток, задержку между ними и коды состояния HTTP, которые вызывают повторную попытку.
Заключение
Дросселирование Microsoft Graph API - это функция, которая помогает поддерживать оптимальную производительность и надежность службы для всех приложений и пользователей. Следуя лучшим практикам и стратегиям, описанным в этой статье блога, вы сможете эффективно избежать или справиться с дросселированием и оптимизировать сетевой трафик с помощью Microsoft Graph API. Это улучшит функциональность вашего приложения и повысит удобство работы пользователей.
Если вы столкнулись с этими проблемами или хотите более подробно изучить их, я рекомендую вам ознакомиться с документацией по этой теме: https://learn.microsoft.com/en-us/training/modules/optimize-network-traffic/