API acelera orientação para parceiros que chamam APIs do Partner Center
A Microsoft está a implementar o estrangulamento da API para permitir um desempenho mais consistente dentro de um período de tempo para os parceiros que chamam as APIs do Partner Center. O estrangulamento limita o número de pedidos a um serviço num período de tempo para evitar o uso excessivo de recursos. Enquanto o Partner Center é projetado para lidar com um grande volume de pedidos, se um número esmagador de pedidos ocorrer por poucos parceiros, o estrangulamento ajuda a manter o melhor desempenho e fiabilidade para todos os parceiros.
Os limites de estrangulamento variam em função do cenário. Por exemplo, se estiver a executar um grande volume de escritas, a possibilidade de estrangulamento é maior do que se estiver apenas a executar leituras.
O que acontece quando ocorre estrangulamento?
Quando um limiar de estrangulamento é ultrapassado, o Partner Center limita quaisquer pedidos adicionais desse cliente por um período de tempo. O comportamento de estrangulamento depende do tipo e do número de pedidos.
Cenários comuns de estrangulamento
As causas mais comuns de estrangulamento dos clientes incluem:
Um grande número de pedidos para um ID de API por Inquilino Parceiro: para algumas APIs do Partner Center, o estrangulamento é determinado pelo ID do Inquilino Parceiro, demasiadas chamadas para essas APIs no mesmo ID do Inquilino Parceiro resultarão em exceder o limiar de estrangulamento.
Um grande número de pedidos de ID de API por Inquilino Sócio ID por ID do Cliente Inquilino: para outras APIs, o estrangulamento é determinado pela combinação ID/Customer Tenant ID do Inquilino Sócio; nesses casos, fazer demasiadas chamadas contra o mesmo ID do inquilino do cliente resultará em estrangulamento - enquanto as chamadas contra outros clientes podem ter sucesso.
Melhores práticas para evitar estrangulamento
Práticas de programação como a votação contínua de um recurso para verificar atualizações e digitalização regular de recolha de recursos para verificar se existem recursos novos ou eliminados são mais propensos a conduzir a estrangulamentos e irão degradar o desempenho global. Chamadas simultâneas de API podem levar a um elevado número de pedidos por tempo unitário, o que também fará com que os pedidos sejam estrangulados. Em vez disso, deve utilizar o rastreio de alterações e alterar notificações. Além disso, deverá ser capaz de utilizar registos de atividade para detetar alterações. Para mais informações, consulte os registos de atividade do Partner Center. Recomendamos vivamente aos parceiros que considerem a utilização do registo de atividade API para obter mais eficiência e evitar estrangulamentos. Veja também o exemplo da utilização de registos de atividade, abaixo.
Melhores práticas para lidar com o estrangulamento
Seguem-se as melhores práticas de manuseamento de estrangulamentos:
- Reduza o grau de paralelismo.
- Reduza a frequência das chamadas.
- Evite recauchutados imediatos porque todos os pedidos se acumulam contra os seus 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 utilizar o atraso de retry-after, faça o seguinte:
Aguarde o número de segundos especificados no cabeçalho Retry-After.
Repita o pedido.
Se o pedido falhar novamente com um código de erro 429, ainda está a ser estrangulado. Relemplitar com o backoff exponencial, use o Retry-After recomendado atrasar e voltar a tentar o pedido até que tenha sucesso.
Se estiver a utilizar o SDK, receberá uma exceção com o código de estado 429 quando o seu pedido estiver a ser acelerado. Utilize a propriedade RetryAfter na exceção e relemisse o pedido após o tempo decorrido.
APIs atualmente impactados pelo estrangulamento
No final, todos os Parceiros Center API que chamem o ponto final de "api.partnercenter.microsoft.com/" serão estrangulados. Atualmente, os limites de estrangulamento só são aplicados nas APIs listadas abaixo. O Partner Center irá recolher a telemetria em cada uma das APIs e ajustará dinamicamente os limites de aceleração. A tabela que se segue lista as APIs onde o estrangulamento é atualmente aplicado.
| Operação | Documentação do Centro de Parceiros |
|---|---|
| {baseURL}/v1/clientes/{customer_id}/encomendas | criar uma ordem |
| {baseURL}/v1/customers/{customer-tenant-id}/subscrições/{id-for-subscription}/upgrades | transição de uma subscrição |
| {baseURL}/v1/customers/{customer-tenant-id}/orders/{order-id} | comprar um addon a uma subscrição |
| {baseURL}/v1/customers/{customer-id}/carts/{cart-id} | criar um carrinho |
| {baseURL}/v1/clientes/{customer-id}/carts/{cart-id}/check-out | checkout um carrinho |
| {baseURL}/v1/customers/{customer-id}/carts/{cart-id} | atualizar um carrinho |
| {baseURL}/v1/clientes/{customer-id}/subscrições/{subscrição-id}/registos | registar uma subscrição |
| {baseURL}/v1/productupgrads | criar entidade de atualização de produtos |
| {baseURL}/v1/clientes/{customer-id}/subscrições/{subscrição-id}/conversões | converter uma subscrição experimental para pago |
| {baseURL}/v1/clientes/{cliente-inquilino-id} | obter um cliente por ID |
| {baseURL}/v1/produtoUpgrades/elegibilidade | obter elegibilidade para atualização de produto |
| {baseURL}/v1/customers/{customer-tenant-id}/subscrições/{id-for-subscription} | gerir subscrição |
| {baseURL}/v1/clientes/{customer_id}/subscrições | obter-all-of-a-cliente-s-subscrições |
| {baseURL}/v1/customers/{customer_id}/subscrições/{subscription_id} | Obter uma subscrição por ID |
| {baseURL}/v1/clientes/{customer_id}/encomendas | Receba todas as encomendas de clientes |
| {baseURL}/v1/customers/{customer_id}/orders/{order_id} | Obter encomenda por ID |
| {baseURL}/v1/customers/{customer_id}/orders/{order_id}/provisioningstatus | Obter o estado de aprovisionamento da subscrição |
| {baseURL}/v1/customers/{customer_id}/subscrições/{subscription_id} | Gerir encomendas e gerir uma subscrição |
| {baseURL}/v1/customers/{customer_id}/subscrições/{subscription_id}/addons | Obter uma lista de suplementos para uma subscrição |
| {baseURL}/v1/customers/{customer_id}/subscrições/{subscription_id}/azureEntitlements | Obter uma lista de elegibilidade do Azure para uma subscrição |
| {baseURL}/v1/customers/{customer_id}/subscrições/{subscription_id}/registrationstatus | Obter o estado de registo da subscrição |
| {baseURL}/v1/clientes/{cliente-inquilino-id}/transfers | Obtenha todas as transferências de um cliente |
| {baseURL}/v1/productUpgrades/{upgrade-id}/status | Obter estado de atualização do produto |
| {baseURL}/v1/clientes/{customer-id}/subscrições/{subscrição-id}/conversões | Obter uma lista de ofertas de conversão de avaliação |
| {baseURL}/v1/clientes/{cliente-inquilino-id}/migrações/newcommerce/validate | Validar uma subscrição para migração |
| {baseURL}/v1/clientes/{customer-tenant-id}/migrations/newcommerce | Criar uma nova migração de comércio |
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 atividade
Para as melhores práticas na análise de alterações diárias, recomendamos que você questione o registo de auditoria para um dia específico.
Na resposta, obterá um resultado com alterações ao tipo de funcionamento específico. Pode filtrar com base na operação que lhe interessa. Por exemplo, se estiver interessado num cliente recém-criado, pode olhar para o operationType = "add_customer".
A lista de operação/recursos pode ser encontrada em documentos abaixo 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: 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"
}
}