Partilhar via


Orientação de limitação da API para parceiros que chamam APIs do Partner Center

A Microsoft está implementando a limitação de API para permitir um desempenho mais consistente dentro de um período de tempo para os parceiros que chamam as APIs do Partner Center. A limitação limita o número de pedidos para um serviço num período de tempo, de modo a impedir a utilização excessiva de recursos. Embora o Centro de Parceiros tenha sido concebido para lidar com um elevado volume de pedidos, se um número significativo de pedidos forem recebidos de apenas alguns parceiros, a limitação ajudará a manter o desempenho e a fiabilidade ideais para todos os parceiros.

Os limites de limitação variam consoante o cenário. Por exemplo, se você estiver executando um grande volume de gravações, a possibilidade de limitação é maior do que se você estiver executando apenas leituras.

O que acontece quando ocorre a limitação?

Quando um limite de limitação é excedido, o Partner Center limita quaisquer outras solicitações desse cliente por um período de tempo. O comportamento de limitação depende do tipo e do número de solicitações.

Cenários comuns de limitação

As causas mais comuns de limitação de clientes incluem:

  • Um grande número de solicitações para uma API por ID de Locatário de Parceiro: para algumas APIs do Partner Center, a limitação é determinada pelo ID de Locatário de Parceiro. Muitas chamadas para essas APIs no mesmo ID de locatário de parceiro resultam em exceder o limite de limitação.
  • Um grande número de solicitações para uma API por ID de locatário de parceiro por ID de locatário de cliente: para outras APIs, a limitação é determinada pela combinação de ID de locatário de parceiro/ID de locatário de cliente; nesses casos, fazer muitas chamadas contra o mesmo ID de locatário do cliente resulta em limitação - enquanto as chamadas contra outros clientes podem ser bem-sucedidas.

Melhores práticas para evitar a limitação

As práticas de programação, como sondar continuamente um recurso para verificar se há atualizações e verificar regularmente as coleções de recursos para verificar se há recursos novos ou excluídos, têm maior probabilidade de levar à limitação e degradar o desempenho geral. Chamadas de API simultâneas podem levar a um alto número de solicitações por unidade de tempo, o que faz com que as solicitações sejam limitadas. Em vez disso, você deve usar o controle de alterações e notificações de alterações. Além disso, você deve ser capaz de usar logs de atividade para detetar alterações. Para obter mais informações, consulte Logs de atividades do Partner Center. É altamente recomendável que os parceiros considerem o uso da API de registro de atividades para obter mais eficiência e evitar limitações. Veja também o exemplo de uso de logs de atividades, abaixo.

Melhores práticas para lidar com a limitação

A seguir estão as práticas recomendadas para lidar com a limitação:

  • Reduza o grau de paralelismo.
  • Reduza a frequência de chamadas.
  • Evite novas tentativas imediatas porque todos os pedidos vão-se acumulando em relação aos limites de utilização.

Ao implementar o processamento de erros, utilize o código de erro HTTP 429 para detetar limitação de largura de banda. A resposta com falha inclui o cabeçalho de resposta Repetir Após. Terminar os pedidos que utilizam o atraso Repetir após é a forma mais rápida de recuperar da limitação de largura de banda.

Para usar o atraso Repetir após:

  1. Aguarde o número de segundos especificado no cabeçalho Repetir Após.
  2. Repita o pedido.
  3. Se o pedido falhar novamente com um código de erro 429, ainda existe limitação. Tente novamente com o recuo exponencial, utilize o atraso recomendado de Repetir Após e repita o pedido até ser bem-sucedido.
  4. Se estiver a utilizar o SDK, receberá uma exceção com o código de estado 429 quando o pedido estiver a ser limitado. Utilize a propriedade RetryAfter na exceção e repita o pedido após o tempo decorrido.

APIs atualmente afetadas pela limitação

No final, cada API do Partner Center que chama o ponto de extremidade de "api.partnercenter.microsoft.com/" é limitada. Atualmente, os limites de limitação são impostos apenas nas APIs listadas abaixo. O Partner Center está coletando a telemetria em cada uma das APIs e ajusta dinamicamente os limites de limitação. A tabela a seguir lista as APIs em que a limitação é imposta no momento.

Operação Documentação do Centro de Parceiros
{baseURL}/v1/customers/{customer_id}/pedidos Criar uma encomenda
{baseURL}/v1/customers/{customer-tenant-id}/subscriptions/{id-for-subscription}/upgrades Fazer a transição de uma subscrição
{baseURL}/v1/customers/{customer-tenant-id}/orders/{order-id} Comprar um addon para uma subscrição
{baseURL}/v1/customers/{customer-id}/carts/{cart-id} Criar um carrinho
{baseURL}/v1/customers/{customer-id}/carts/{cart-id}/checkout fazer checkout de um carrinho
{baseURL}/v1/customers/{customer-id}/carts/{cart-id} Atualizar um carrinho
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/registrations registar uma subscrição
{baseURL}/v1/productupgrades Criar entidade de atualização de produto
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/conversões Converter uma subscrição de avaliação em paga
{baseURL}/v1/customers/{customer-tenant-id} obter um cliente por ID
{baseURL}/v1/customers/{customer-tenant-id} excluir uma conta de cliente da Sandbox
{baseURL}/v1/customers?size={size} Obter uma lista de clientes
{baseURL}/v1/productUpgrades/elegibilidade Obter elegibilidade para atualização de produto
{baseURL}/v1/customers/{customer-tenant-id}/subscriptions/{id-for-subscription} Gerir subscrição
{baseURL}/v1/customers/{customer_id}/assinaturas get-all-of-a-customer-s-subscriptions
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id} Obter uma subscrição por ID
{baseURL}/v1/customers/{customer_id}/pedidos Receba todos os pedidos de clientes
{baseURL}/v1/customers/{customer_id}/orders/{order_id} Receba uma encomenda por ID
{baseURL}/v1/customers/{customer_id}/orders/{order_id}/provisioningstatus Obter status de provisionamento de assinatura
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id} Gerir encomendas e gerir uma subscrição
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/addons Obter uma lista de complementos para uma assinatura
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/azureEntitlements Obter uma lista de direitos do Azure para uma subscrição
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/registrationstatus Obter o estado de registo da subscrição
{baseURL}/v1/customers/{customer-tenant-id}/transferências Obtenha todas as transferências de um cliente
{baseURL}/v1/productUpgrades/{upgrade-id}/status Obter status de atualização do produto
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/conversões Obtenha uma lista de ofertas de conversão de avaliação
{baseURL}/v1/customers/{customer-tenant-id}/migrations/newcommerce/validate Validar uma subscrição para migração
{baseURL}/v1/customers/{customer-tenant-id}/migrations/newcommerce Criar uma nova migração de comércio
{baseURL}/v1/customers/{customerId}/promotionEligibilities Verificar a elegibilidade de uma promoção

Resposta do código de erro:

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." } 

Exemplo de registo de atividades

Para obter as melhores práticas na análise de alterações diárias, recomendamos que você consulte o registro de auditoria de um dia específico.

Na resposta, você obtém um resultado com alterações no tipo de operação específico. Você pode filtrar com base na operação que lhe interessa. Por exemplo, se você estiver interessado em um cliente recém-criado, você pode olhar para operationType = "add_customer".

A lista de tipos de operação/recursos pode ser encontrada nesses documentos da API.

Exemplo de resposta

Pedido:

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 

Resposta:

{ 

    "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": "aaaabbbb-0000-cccc-1111-dddd2222eeee", 

            "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": "aaaabbbb-0000-cccc-1111-dddd2222eeee", 

            "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" 

    } 

}