Регулирование интерфейсов API для партнеров, вызывающих интерфейсы API Центра партнеров
Корпорация Майкрософт реализует регулирование API, чтобы обеспечить более согласованную производительность в течение периода времени для партнеров, вызывающих API Центра партнеров. При регулировании ограничивается количество запросов к службе в конкретный период времени, чтобы предотвратить чрезмерное потребление ресурсов. Хотя Центр партнеров предназначен для обработки большого количества запросов, при отправке огромного количества запросов несколькими партнерами регулирование поможет обеспечить оптимальную производительность и надежность для всех партнеров.
Ограничения регулирования зависят от сценария. Например, если вы выполняете большой объем операций записи, возможность регулирования выше, чем при выполнении только операций чтения.
Что происходит при регулировании?
Если порог регулирования превышен, в Центре партнеров ограничивается количество последующих запросов от этого клиента на определенный период. Поведение регулирования зависит от типа и количества запросов.
Стандартные сценарии регулирования
Ниже перечислены наиболее распространенные причины регулирования клиентов:
- Большое количество запросов для API на идентификатор клиента партнера: для некоторых API Центра партнеров регулирование определяется идентификатором клиента партнера. Слишком много вызовов этих API в том же идентификаторе клиента партнера приводит к превышению порогового значения регулирования.
- Большое количество запросов на API для каждого идентификатора клиента партнера на идентификатор клиента: для других API регулирование определяется сочетанием идентификатора клиента партнера или идентификатора клиента. В этих случаях слишком много вызовов для одного и того же идентификатора клиента приводит к регулированию , а вызовы к другим клиентам могут завершиться успешно.
Рекомендации по предотвращению регулирования
Такие методики программирования, как непрерывный опрос ресурса для проверки обновлений и регулярного сканирования коллекций ресурсов для проверки новых или удаленных ресурсов, скорее всего, приводят к регулированию и снижению общей производительности. Одновременные вызовы API могут привести к большому количеству запросов в единицу времени, что приводит к регулированию запросов. Вместо этого следует использовать уведомления об отслеживании изменений и изменениях. Кроме того, вы сможете использовать журналы действий для обнаружения изменений. Дополнительные сведения см . в журналах действий Центра партнеров. Мы настоятельно рекомендуем партнерам использовать API журнала действий для повышения эффективности и избегать регулирования. См. также пример использования журналов действий ниже.
Советы и рекомендации по управлению регулированием
Ниже приведены рекомендации по обработке регулирования.
- Уменьшите степень параллелизма.
- Уменьшите частоту вызовов.
- Избегайте немедленных повторных попыток, так как все запросы накапливаются в соответствии с ограничениями использования.
При реализации обработки ошибок используйте код ошибки HTTP 429, чтобы определить необходимость регулирования. Неудачный ответ содержит заголовок ответа Retry-After. Отклонение запросов с помощью задержки Retry-after является самым быстрым способом восстановления после регулирования.
Чтобы использовать задержку повторных попыток, выполните следующие действия:
- Подождите количество секунд, указанное в заголовке Retry-After.
- Повторите запрос.
- Если запрос снова завершается ошибкой с кодом ошибки 429, вы по-прежнему регулируетесь. Повторите попытку с экспоненциальным обратным выходом, используйте рекомендуемую задержку Retry-After и повторите запрос до тех пор, пока он не завершится успешно.
- Если вы используете пакет SDK, вы получите исключение с кодом состояния 429 при регулировании запроса. Используйте свойство RetryAfter в исключении и повторите запрос после истечения времени.
API, затронутые регулированием в настоящее время
В конце концов, каждый api Центра партнеров, вызывающий конечную точку "api.partnercenter.microsoft.com/", регулируется. В настоящее время ограничения регулирования применяются только для API, перечисленных ниже. Центр партнеров собирает данные телеметрии для каждого API и динамически настраивает ограничения регулирования. В следующей таблице перечислены API-интерфейсы, в которых в настоящее время применяется регулирование.
Операция | Документация для разработчиков Центра партнеров |
---|---|
{baseURL}/v1/customers/{customer_id}/orders | создание заказа |
{baseURL}/v1/customers/{customer-tenant-id}/subscriptions/{id-for-subscription}/upgrades | переход подписки |
{baseURL}/v1/customers/{customer-tenant-id}/orders/{order-id} | приобретение надстройки в подписку |
{baseURL}/v1/customers/{customer-id}/carts/{cart-id} | создание корзины |
{baseURL}/v1/customers/{customer-id}/carts/{cart-id}/checkout | извлечь корзину |
{baseURL}/v1/customers/{customer-id}/carts/{cart-id} | обновление корзины |
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/registrations | регистрация подписки |
{baseURL}/v1/productupgrades | создание сущности обновления продукта |
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/conversions | преобразование пробной подписки в платную |
{baseURL}/v1/customers/{customer-tenant-id} | получение клиента по идентификатору |
{baseURL}/v1/productUpgrades/eligibility | получение права на обновление продукта |
{baseURL}/v1/customers/{customer-tenant-id}/subscriptions/{id-for-subscription} | управление подпиской |
{baseURL}/v1/customers/{customer_id}/subscriptions | get-all-of-customer-s-subscriptions |
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id} | Получение сведений о подписке по идентификатору |
{baseURL}/v1/customers/{customer_id}/orders | Получение списка всех заказов клиента |
{baseURL}/v1/customers/{customer_id}/orders/{order_id} | Получение заказа по идентификатору |
{baseURL}/v1/customers/{customer_id}/orders/{order_id}/provisioningstatus | Получение сведений о состоянии подготовки подписки |
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id} | Управление заказами и управление подпиской |
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/addons | Получение списка надстроек для подписки |
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/azureEntitlements | Получение списка прав Azure для подписки |
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/registrationstatus | Получение сведений о состоянии регистрации подписки |
{baseURL}/v1/customers/{customer-tenant-id}/transfers | Получение сведений обо всех операциях перемещения для клиента |
{baseURL}/v1/productUpgrades/{upgrade-id}/status | Получение сведений о состоянии обновления продукта |
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/conversions | Получение списка предложений для преобразования пробных версий |
{baseURL}/v1/customers/{customer-tenant-id}/migrations/new commerce/validate | Проверка подписки для миграции |
{baseURL}/v1/customers/{customer-tenant-id}/migrations/new commerce | Создание миграции на новую коммерческую модель |
{baseURL}/v1/customers/{customerId}/promotionEligibilities | Проверка право на повышение уровня |
Ответ кода ошибки:
HTTP/1.1 429 Too Many Requests
Content-Length: 84
Content-Type: application/json
Retry-After: 57
Date: Tue, 21 Jul 2020 04:10:58 GMT
{ "statusCode": 429, "message": "Rate limit is exceeded. Try again in 57 seconds." }
Пример журнала действий
Для анализа ежедневных изменений рекомендуется запросить запись аудита за определенный день.
В ответе вы получите результат с изменениями конкретного типа операции. Вы можете фильтровать на основе операции, о чем вы заботитесь. Например, если вы заинтересованы в только что созданном клиенте, вы можете посмотреть на operationType = "add_customer".
Список операций и ресурсов можно найти в этих документах ПО API.
Пример ответа
Запрос:
Http Get call: https://api.partnercenter.microsoft.com/v1/auditrecords?startDate=2020-09-02&endDate=2020-09-02&size=50
Authorization: Bearer <token>
Accept: application/json
MS-RequestId: 127facaa-e389-41f8-8bb7-1d1af99db893
MS-CorrelationId: aaaa0000-bb11-2222-33cc-444444dddddd
X-Locale: en-US
Host: api.partnercenter.microsoft.com
Connection: Keep-Alive
Ответ.
{
"totalCount": 17,
"items": [
{
"id": "9daaeb1c-4195-4db5-9f1d-509eb70c8c2d_e905b566-4779-4e57-944c-7b1b5312705b_updatecustomeruserlicenses_637346859797753934",
"partnerId": "9daaeb1c-4195-4db5-9f1d-509eb70c8c2d",
"participants": [
"9daaeb1c-4195-4db5-9f1d-509eb70c8c2d"
],
"customerId": "e905b566-4779-4e57-944c-7b1b5312705b",
"userPrincipalName": "admin@testsw09.onmicrosoft.com",
"applicationId": "FulfillmentService",
"resourceType": "license",
"operationType": "update_customer_user_licenses",
"operationDate": "2020-09-02T23:26:19.7753934Z",
"operationStatus": "succeeded",
"customizedData": [
{
"key": "CustomerUserId",
"value": "933808c7-b165-496c-a24e-1a4b7846fab4"
}
],
"attributes": {
"objectType": "AuditRecord"
}
},
{
"id": "9daaeb1c-4195-4db5-9f1d-509eb70c8c2d_86bddccf-9a53-40c6-907c-08067a3f8da7_ia80zlkxp6ewoqpp35pbqjlhqv9iigvz1_createorder_637346662909268372",
"partnerId": "9daaeb1c-4195-4db5-9f1d-509eb70c8c2d",
"participants": [
"9daaeb1c-4195-4db5-9f1d-509eb70c8c2d"
],
"customerId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"customerName": "CustomMetersStagingTest",
"userPrincipalName": "admin@testsw09.onmicrosoft.com",
"applicationId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"resourceType": "order",
"resourceNewValue": "{\"Id\":\"Ia80ZLkXp6eWOqpp35pBQJLhqv9IiGVZ1\",\"AlternateId\":\"64144d300bde\",\"ReferenceCustomerId\":\"aaaabbbb-0000-cccc-1111-dddd2222eeee\",\"BillingCycle\":\"monthly\",\"CurrencyCode\":\"USD\",\"CurrencySymbol\":\"$\",\"LineItems\":[{\"LineItemNumber\":0,\"ProvisioningContext\":null,\"OfferId\":\"DZH318Z0C964:0001:DZH318Z0BZDG\",\"SubscriptionId\":\"aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e\",\"ParentSubscriptionId\":null,\"TermDuration\":\"P1M\",\"TransactionType\":\"New\",\"FriendlyName\":\"SaaS custom meter offer - Bronze\",\"Quantity\":1,\"Pricing\":null,\"PartnerIdOnRecord\":null,\"RenewsTo\":null,\"Links\":{\"Product\":{\"Uri\":\"/products/DZH318Z0C964?country=US\",\"Method\":\"GET\",\"Body\":null,\"Headers\":[]},\"Sku\":{\"Uri\":\"/products/DZH318Z0C964/skus/0001?country=US\",\"Method\":\"GET\",\"Body\":null,\"Headers\":[]},\"Availability\":{\"Uri\":\"/products/DZH318Z0C964/skus/0001/availabilities/DZH318Z0BZDG?country=US\",\"Method\":\"GET\",\"Body\":null,\"Headers\":[]},\"ActivationLinks\":{\"Uri\":\"/customers/aaaabbbb-0000-cccc-1111-dddd2222eeee/orders/Ia80ZLkXp6eWOqpp35pBQJLhqv9IiGVZ1/lineitems/0/activationlinks\",\"Method\":\"GET\",\"Body\":null,\"Headers\":[]}}}],\"CreationDate\":\"2020-09-02T17:58:01.7755853Z\",\"Status\":\"pending\",\"TransactionType\":\"UserPurchase\",\"Links\":{\"Self\":{\"Uri\":\"/customers/aaaabbbb-0000-cccc-1111-dddd2222eeee/orders/Ia80ZLkXp6eWOqpp35pBQJLhqv9IiGVZ1\",\"Method\":\"GET\",\"Body\":null,\"Headers\":[]},\"ProvisioningStatus\":{\"Uri\":\"/customers/aaaabbbb-0000-cccc-1111-dddd2222eeee/orders/Ia80ZLkXp6eWOqpp35pBQJLhqv9IiGVZ1/provisioningstatus\",\"Method\":\"GET\",\"Body\":null,\"Headers\":[]},\"PatchOperation\":{\"Uri\":\"/customers/aaaabbbb-0000-cccc-1111-dddd2222eeee/orders/Ia80ZLkXp6eWOqpp35pBQJLhqv9IiGVZ1\",\"Method\":\"PATCH\",\"Body\":null,\"Headers\":[]}},\"Client\":{\"marketplaceCountry\":\"US\",\"deviceFamily\":\"UniversalStore-PartnerCenter\",\"name\":\"Partner Center Web\"},\"Attributes\":{\"ObjectType\":\"Order\"}}",
"operationType": "create_order",
"originalCorrelationId": "96514ebe-c1b2-4865-cb46-2c2d20a2e911",
"operationDate": "2020-09-02T17:58:10.9268372Z",
"operationStatus": "succeeded",
"customizedData": [
{
"key": "OrderId",
"value": "Ia80ZLkXp6eWOqpp35pBQJLhqv9IiGVZ1"
},
{
"key": "AlternateId",
"value": "64144d300bde"
},
{
"key": "BillingCycle",
"value": "Monthly"
},
{
"key": "OfferId-0",
"value": "DZH318Z0C964:0001:DZH318Z0BZDG"
},
{
"key": "SubscriptionId-0",
"value": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"
},
{
"key": "SubscriptionName-0",
"value": "SaaS custom meter offer - Bronze"
},
{
"key": "Quantity-0",
"value": "1"
},
{
"key": "PartnerOnRecord-0",
"value": null
}
],
"attributes": {
"objectType": "AuditRecord"
}
},
{
"id": "9daaeb1c-4195-4db5-9f1d-509eb70c8c2d_86bddccf-9a53-40c6-907c-08067a3f8da7_86bddccf-9a53-40c6-907c-08067a3f8da7_addcustomer_637346648528069005",
"partnerId": "9daaeb1c-4195-4db5-9f1d-509eb70c8c2d",
"participants": [
"9daaeb1c-4195-4db5-9f1d-509eb70c8c2d"
],
"customerId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"customerName": "CustomMetersStagingTest",
"userPrincipalName": "admin@testsw09.onmicrosoft.com",
"applicationId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"resourceType": "customer",
"resourceNewValue": "{\"Id\":\"aaaabbbb-0000-cccc-1111-dddd2222eeee\",\"CommerceId\":\"9dd78b4f-f98a-44b4-a2fa-2b82ac58d24c\",\"CompanyProfile\":{\"TenantId\":\"aaaabbbb-0000-cccc-1111-dddd2222eeee\",\"Domain\":\"CustomMetersStagingTest.onmicrosoft.com\",\"CompanyName\":\"CustomMetersStagingTest\",\"Address\":null,\"Email\":null,\"OrganizationRegistrationNumber\":null,\"Links\":{\"Self\":{\"Uri\":\"/customers/aaaabbbb-0000-cccc-1111-dddd2222eeee/profiles/company\",\"Method\":\"GET\",\"Body\":null,\"Headers\":[]}},\"Attributes\":{\"ObjectType\":\"CustomerCompanyProfile\"}},\"BillingProfile\":{\"Id\":\"bbbbcccc-1111-dddd-2222-eeee3333ffff\",\"FirstName\":\"CustomMetersStagingTest\",\"LastName\":\"CustomMetersStagingTest\",\"Email\":\"CustomMetersStagingTest@CustomMetersStagingTest.com\",\"Culture\":\"en-US\",\"Language\":\"en\",\"CompanyName\":\"CustomMetersStagingTest\",\"DefaultAddress\":{\"Id\":null,\"Country\":\"US\",\"Region\":null,\"City\":\"Seattle\",\"State\":\"WA\",\"District\":null,\"AddressLine1\":\"CustomMetersStagingTest\",\"AddressLine2\":null,\"AddressLine3\":null,\"PostalCode\":\"98122\",\"FirstName\":\"CustomMetersStagingTest\",\"LastName\":\"CustomMetersStagingTest\",\"EmailAddress\":null,\"PhoneNumber\":null,\"MiddleName\":null},\"Attributes\":{\"Etag\":\"-2279334701316321663\",\"ObjectType\":\"CustomerBillingProfile\"}},\"RelationshipToPartner\":\"reseller\",\"AllowDelegatedAccess\":true,\"UserCredentials\":{\"userName\":\"admin\",\"password\":\"\"},\"AssociatedPartnerId\":null,\"CustomDomains\":null,\"Attributes\":{\"ObjectType\":\"Customer\"}}",
"operationType": "add_customer",
"originalCorrelationId": "7550d9ea-e64a-416f-e49b-3670c516cf69",
"operationDate": "2020-09-02T17:34:12.8069005Z",
"operationStatus": "succeeded",
"customizedData": [
{
"key": "PrimaryDomainName",
"value": "CustomMetersStagingTest.onmicrosoft.com"
},
{
"key": "Relationship",
"value": "Reseller"
}
],
"attributes": {
"objectType": "AuditRecord"
}
},
...
],
"links": {
"self": {
"uri": "/auditrecords?startDate=2020-09-02&endDate=2020-09-02&size=50",
"method": "GET",
"headers": []
}
},
"attributes": {
"objectType": "Collection"
}
}