Orientações de limitação de API para parceiros que chamam as APIs do Partner Center
A Microsoft está implementando a limitação de API para permitir um desempenho mais consistente dentro de um intervalo de tempo para os parceiros que chamam as APIs do Partner Center. A limitação restringe o número de solicitações para um serviço por um determinado período para evitar o uso excessivo de recursos. Embora o Partner Center seja criado para lidar com um alto volume de solicitações, se um número excessivo delas ocorrer por alguns parceiros, a limitação ajudará a manter o desempenho ideal e a confiabilidade para todos os parceiros.
Limites de limitação variam de acordo com 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 uma limitação restritiva é excedida, o Partner Center limita todas as solicitações subsequentes do cliente em questão por um determinado período. 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 de uma API por ID de Locatário de Parceiro: para algumas APIs do Partner Center, a limitação é determinada pela ID do Locatário do 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 de 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.
Práticas recomendadas para evitar a limitação
As práticas de programação, como sondagem contínua de um recurso para verificar se há atualizações e varredura regular de 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 as notificações de alterações. Além disso, você deve ser capaz de usar logs de atividade para detectar 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 log de atividades para obter mais eficiência e evitar limitações. Veja também o exemplo de uso de logs de atividades, abaixo.
Práticas recomendadas para tratamento de limitação
Estas são as práticas recomendadas para lidar com a limitação:
- Reduza o grau de paralelismo.
- Reduzir a frequência de chamadas.
- Evitar novas repetições imediatas, pois todas as solicitações se acumulam em relação aos seus limites de uso.
Quando você implementa o tratamento de erro, use o código de erro HTTP 429 para detectar a limitação. A resposta com falha inclui o cabeçalho de resposta de Retry-After. Retirar solicitações usando o atraso de Retry-After é a maneira mais rápida de se recuperar da limitação.
Para usar o atraso de repetição posterior:
- Aguarde o número de segundos especificado no cabeçalho Repetir Depois.
- Tente novamente a solicitação.
- Se a solicitação falhar novamente com um código de erro 429, você ainda estará sendo limitado. Tente novamente com recuo exponencial, use o atraso recomendado de repetição após e tente novamente a solicitação até que ela seja bem-sucedida.
- Se você estiver usando o SDK, receberá uma exceção com o código de status 429 quando sua solicitação estiver sendo limitada. Use a propriedade RetryAfter na exceção e repita a solicitação 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 aplicados 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 Partner Center |
---|---|
{baseURL}/v1/customers/{ID_do_cliente}/orders | Criar um pedido |
{baseURL}/v1/customers/{customer-tenant-id}/subscriptions/{id-for-subscription}/upgrades | fazer a transição de uma assinatura |
{baseURL}/v1/customers/{customer-tenant-id}/orders/{order-id} | Comprar um complemento para uma assinatura |
{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 | registrar uma assinatura |
{baseURL}/v1/productupgrades | Criar entidade de atualização de produto |
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/conversions | converter uma assinatura de avaliação em paga |
{baseURL}/v1/customers/{customer-tenant-id} | obter um cliente por ID |
{baseURL}/v1/productUpgrades/elegibilidade | Obter elegibilidade para atualização de produto |
{baseURL}/v1/customers/{customer-tenant-id}/subscriptions/{id-for-subscription} | gerenciar assinatura |
{baseURL}/v1/customers/{ID_do_cliente}/subscriptions | get-all-of-a-customer-s-subscriptions |
{baseURL}/v1/customers/{ID_do_cliente}/subscriptions/{ID_da_assinatura} | Obter uma assinatura por ID |
{baseURL}/v1/customers/{ID_do_cliente}/orders | Obter todos os pedidos de clientes |
{baseURL}/v1/customers/{ID_do_cliente}/orders/{ID_do_pedido} | Obtenha um pedido por ID |
{baseURL}/v1/customers/{ID_do_cliente}/orders/{ID_do_pedido}/provisioningstatus | Obter o status de provisionamento da assinatura |
{baseURL}/v1/customers/{ID_do_cliente}/subscriptions/{ID_da_assinatura} | Gerenciar pedidos e uma assinatura |
{baseURL}/v1/customers/{ID_do_cliente}/subscriptions/{ID_da_assinatura}/addons | Obter uma lista de complementos de uma assinatura |
{baseURL}/v1/customers/{ID_do_cliente}/subscriptions/{ID_da_assinatura}/azureEntitlements | Obter uma lista de direitos do Azure para uma assinatura |
{baseURL}/v1/customers/{ID_do_cliente}/subscriptions/{ID_da_assinatura}/registrationstatus | Obter o status de registro de assinatura |
{baseURL}/v1/customers/{ID-do-locatário-do-cliente}/transfers | Obter todas as transferências de um cliente |
{baseURL}/v1/productUpgrades/{ID-da-atualização}/status | Obter o status de atualização do produto |
{baseURL}/v1/customers/{ID-do-cliente}/subscriptions/{ID-da-assinatura}/conversions | Obter uma lista de ofertas de conversão de avaliação |
{baseURL}/v1/customers/{customer-tenant-id}/migrations/newcommerce/validate | Validar uma assinatura para migração |
{baseURL}/v1/customers/{customer-tenant-id}/migrations/newcommerce | Criar uma 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 registro de atividades
Para obter as práticas recomendadas na análise de alterações diárias, recomendamos que você consulte o registro de auditoria para um dia específico.
Na resposta, você obtém um resultado com alterações em um 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, poderá examinar operationType = "add_customer".
A lista de tipos de operação/recursos pode ser encontrada nesses documentos da API.
Exemplo de resposta
Solicitação:
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: de9c2ccc-40dd-4186-9660-65b9b64c3d14
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": "86bddccf-9a53-40c6-907c-08067a3f8da7",
"customerName": "CustomMetersStagingTest",
"userPrincipalName": "admin@testsw09.onmicrosoft.com",
"applicationId": "4990cffe-04e8-4e8b-808a-1175604b879f",
"resourceType": "order",
"resourceNewValue": "{\"Id\":\"Ia80ZLkXp6eWOqpp35pBQJLhqv9IiGVZ1\",\"AlternateId\":\"64144d300bde\",\"ReferenceCustomerId\":\"86bddccf-9a53-40c6-907c-08067a3f8da7\",\"BillingCycle\":\"monthly\",\"CurrencyCode\":\"USD\",\"CurrencySymbol\":\"$\",\"LineItems\":[{\"LineItemNumber\":0,\"ProvisioningContext\":null,\"OfferId\":\"DZH318Z0C964:0001:DZH318Z0BZDG\",\"SubscriptionId\":\"f428d44a-d08b-348b-579e-ce92a6362c7b\",\"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/86bddccf-9a53-40c6-907c-08067a3f8da7/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/86bddccf-9a53-40c6-907c-08067a3f8da7/orders/Ia80ZLkXp6eWOqpp35pBQJLhqv9IiGVZ1\",\"Method\":\"GET\",\"Body\":null,\"Headers\":[]},\"ProvisioningStatus\":{\"Uri\":\"/customers/86bddccf-9a53-40c6-907c-08067a3f8da7/orders/Ia80ZLkXp6eWOqpp35pBQJLhqv9IiGVZ1/provisioningstatus\",\"Method\":\"GET\",\"Body\":null,\"Headers\":[]},\"PatchOperation\":{\"Uri\":\"/customers/86bddccf-9a53-40c6-907c-08067a3f8da7/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": "f428d44a-d08b-348b-579e-ce92a6362c7b"
},
{
"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": "86bddccf-9a53-40c6-907c-08067a3f8da7",
"customerName": "CustomMetersStagingTest",
"userPrincipalName": "admin@testsw09.onmicrosoft.com",
"applicationId": "4990cffe-04e8-4e8b-808a-1175604b879f",
"resourceType": "customer",
"resourceNewValue": "{\"Id\":\"86bddccf-9a53-40c6-907c-08067a3f8da7\",\"CommerceId\":\"9dd78b4f-f98a-44b4-a2fa-2b82ac58d24c\",\"CompanyProfile\":{\"TenantId\":\"86bddccf-9a53-40c6-907c-08067a3f8da7\",\"Domain\":\"CustomMetersStagingTest.onmicrosoft.com\",\"CompanyName\":\"CustomMetersStagingTest\",\"Address\":null,\"Email\":null,\"OrganizationRegistrationNumber\":null,\"Links\":{\"Self\":{\"Uri\":\"/customers/86bddccf-9a53-40c6-907c-08067a3f8da7/profiles/company\",\"Method\":\"GET\",\"Body\":null,\"Headers\":[]}},\"Attributes\":{\"ObjectType\":\"CustomerCompanyProfile\"}},\"BillingProfile\":{\"Id\":\"4beafd7b-cdab-5bdc-52ed-02e16edf2e7a\",\"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"
}
}
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de