Поделиться через


Регулирование интерфейсов API для партнеров, вызывающих интерфейсы API Центра партнеров

Корпорация Майкрософт реализует регулирование API, чтобы обеспечить более согласованную производительность в течение периода времени для партнеров, вызывающих API Центра партнеров. При регулировании ограничивается количество запросов к службе в конкретный период времени, чтобы предотвратить чрезмерное потребление ресурсов. Хотя Центр партнеров предназначен для обработки большого количества запросов, при отправке огромного количества запросов несколькими партнерами регулирование поможет обеспечить оптимальную производительность и надежность для всех партнеров.

Ограничения регулирования зависят от сценария. Например, если вы выполняете большой объем операций записи, возможность регулирования выше, чем при выполнении только операций чтения.

Что происходит при регулировании?

Если порог регулирования превышен, в Центре партнеров ограничивается количество последующих запросов от этого клиента на определенный период. Поведение регулирования зависит от типа и количества запросов.

Стандартные сценарии регулирования

Ниже перечислены наиболее распространенные причины регулирования клиентов:

  • Большое количество запросов для API на идентификатор клиента партнера: для некоторых API Центра партнеров регулирование определяется идентификатором клиента партнера. Слишком много вызовов этих API в том же идентификаторе клиента партнера приводит к превышению порогового значения регулирования.
  • Большое количество запросов на API для каждого идентификатора клиента партнера на идентификатор клиента: для других API регулирование определяется сочетанием идентификатора клиента партнера или идентификатора клиента. В этих случаях слишком много вызовов для одного и того же идентификатора клиента приводит к регулированию , а вызовы к другим клиентам могут завершиться успешно.

Рекомендации по предотвращению регулирования

Такие методики программирования, как непрерывный опрос ресурса для проверки обновлений и регулярного сканирования коллекций ресурсов для проверки новых или удаленных ресурсов, скорее всего, приводят к регулированию и снижению общей производительности. Одновременные вызовы API могут привести к большому количеству запросов в единицу времени, что приводит к регулированию запросов. Вместо этого следует использовать уведомления об отслеживании изменений и изменениях. Кроме того, вы сможете использовать журналы действий для обнаружения изменений. Дополнительные сведения см . в журналах действий Центра партнеров. Мы настоятельно рекомендуем партнерам использовать API журнала действий для повышения эффективности и избегать регулирования. См. также пример использования журналов действий ниже.

Советы и рекомендации по управлению регулированием

Ниже приведены рекомендации по обработке регулирования.

  • Уменьшите степень параллелизма.
  • Уменьшите частоту вызовов.
  • Избегайте немедленных повторных попыток, так как все запросы накапливаются в соответствии с ограничениями использования.

При реализации обработки ошибок используйте код ошибки HTTP 429, чтобы определить необходимость регулирования. Неудачный ответ содержит заголовок ответа Retry-After. Отклонение запросов с помощью задержки Retry-after является самым быстрым способом восстановления после регулирования.

Чтобы использовать задержку повторных попыток, выполните следующие действия:

  1. Подождите количество секунд, указанное в заголовке Retry-After.
  2. Повторите запрос.
  3. Если запрос снова завершается ошибкой с кодом ошибки 429, вы по-прежнему регулируетесь. Повторите попытку с экспоненциальным обратным выходом, используйте рекомендуемую задержку Retry-After и повторите запрос до тех пор, пока он не завершится успешно.
  4. Если вы используете пакет 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" 

    } 

}