Richtlijnen voor API-beperking voor partners die Partner Center-API's aanroepen

Microsoft implementeert API-beperking om binnen een bepaalde periode consistentere prestaties mogelijk te maken voor partners die de Partner Center-API's aanroepen. Het aantal aanvragen naar een service in een tijdsduur wordt beperkt om te voorkomen dat bronnen overmatig worden gebruikt. Hoewel partnercentrum is ontworpen om een groot aantal aanvragen af te handelen, helpt beperking om optimale prestaties en betrouwbaarheid voor alle partners te behouden als er een overweldigend aantal aanvragen voorkomt door slechts enkele partners.

Beperkingslimieten variëren op basis van het scenario. Als u bijvoorbeeld een groot aantal schrijfbewerkingen uitvoert, is de mogelijkheid voor beperking hoger dan als u alleen leesbewerkingen uitvoert.

Wat gebeurt er wanneer beperking plaatsvindt?

Wanneer een beperkingsdrempel wordt overschreden, beperkt Het Partnercentrum eventuele verdere aanvragen van die client gedurende een bepaalde periode. Het beperkingsgedrag is afhankelijk van het type en het aantal aanvragen.

Gebruikelijke beperkingsscenario's

De meest voorkomende oorzaken van beperking van clients zijn:

  • Een groot aantal aanvragen voor een API per partnertenant-id: voor sommige Partnercentrum-API's wordt beperking bepaald door de tenant-id van de partner. Te veel aanroepen naar deze API's op dezelfde partnertenant-id leiden ertoe dat de drempelwaarde voor beperking wordt overschreden.
  • Een groot aantal aanvragen voor een API per partnertenant-id per tenant-id van de klant: voor andere API's wordt beperking bepaald door combinatie van tenant-id/klanttenant-id van de partner. In die gevallen leidt het maken van te veel aanroepen op basis van dezelfde tenant-id van de klant tot beperking, terwijl aanroepen voor andere klanten kunnen slagen.

Best practices om aanvraagbeperking te voorkomen

Programmeerprocedures, zoals het continu peilen van een resource om te controleren op updates en het regelmatig scannen van resourceverzamelingen om te controleren op nieuwe of verwijderde resources, leiden waarschijnlijker tot beperking en verminderde algehele prestaties. Gelijktijdige API-aanroepen kunnen leiden tot een groot aantal aanvragen per eenheidstijd, waardoor aanvragen worden beperkt. Gebruik in plaats daarvan wijzigingen bijhouden en wijzigingsmeldingen. Daarnaast moet u activiteitenlogboeken kunnen gebruiken voor het detecteren van wijzigingen. Zie activiteitenlogboeken van Partnercentrum voor meer informatie. We raden partners ten zeerste aan om de API voor activiteitenlogboeken te gebruiken voor meer efficiëntie en om beperking te voorkomen. Zie ook het voorbeeld van het gebruik van activiteitenlogboeken hieronder.

Best practices voor het verwerken van aanvraagbeperking

Hier volgen de aanbevolen procedures voor het afhandelen van beperking:

  • Verminder de mate van parallelle uitvoering.
  • Verminder de frequentie van aanroepen.
  • Vermijd onmiddellijke nieuwe pogingen omdat alle aanvragen worden opgebouwd op basis van uw gebruikslimieten.

Gebruik de HTTP-foutcode 429 om beperking te detecteren wanneer u foutafhandeling implementeert. De mislukte reactie bevat de antwoordheader Retry-After. Het uitstellen van aanvragen met behulp van de vertraging Retry-After is de snelste manier om te herstellen van beperking.

De vertraging opnieuw proberen gebruiken:

  1. Wacht het aantal seconden dat is opgegeven in de kopTekst Opnieuw proberen.
  2. Probeer de aanvraag opnieuw.
  3. Als de aanvraag opnieuw mislukt met een 429-foutcode, wordt u nog steeds beperkt. Probeer het opnieuw met Exponentieel uitstel, gebruik de aanbevolen vertraging na opnieuw proberen en voer de aanvraag opnieuw uit totdat deze is geslaagd.
  4. Als u de SDK gebruikt, ontvangt u een uitzondering met statuscode 429 wanneer uw aanvraag wordt beperkt. Gebruik de eigenschap RetryAfter in de uitzondering en voer de aanvraag opnieuw uit nadat de tijd is verstreken.

API's die momenteel worden beïnvloed door beperking

Uiteindelijk wordt elke API van partnercentrum die het eindpunt 'api.partnercenter.microsoft.com/' aanroept, beperkt. Momenteel worden de beperkingslimieten alleen afgedwongen op de onderstaande API's. Partner Center verzamelt de telemetrie op elk van de API's en past de beperkingslimieten dynamisch aan. De volgende tabel bevat de API's waarbij beperking momenteel wordt afgedwongen.

Bewerking Documentatie voor Partnercentrum
{baseURL}/v1/customers/{customer_id}/orders een bestelling maken
{baseURL}/v1/customers/{customer-tenant-id}/subscriptions/{id-for-subscription}/upgrades een abonnement overdragen
{baseURL}/v1/customers/{customer-tenant-id}/orders/{order-id} een invoegtoepassing kopen voor een abonnement
{baseURL}/v1/customers/{customer-id}/carts/{cart-id} een winkelwagen maken
{baseURL}/v1/customers/{customer-id}/carts/{cart-id}/checkout een winkelwagen uitchecken
{baseURL}/v1/customers/{customer-id}/carts/{cart-id} een winkelwagen bijwerken
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/registrations een abonnement registreren
{baseURL}/v1/productupgrades een entiteit voor productupgrade maken
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/conversions een proefabonnement converteren naar betaald
{baseURL}/v1/customers/{customer-tenant-id} een klant ophalen op basis van id
{baseURL}/v1/productUpgrades/geschiktheid geschiktheid krijgen voor productupgrade
{baseURL}/v1/customers/{customer-tenant-id}/subscriptions/{id-for-subscription} abonnement beheren
{baseURL}/v1/customers/{customer_id}/subscriptions get-all-of-a-customer-s-subscriptions
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id} Een abonnement ophalen op id
{baseURL}/v1/customers/{customer_id}/orders Alle klantorders ophalen
{baseURL}/v1/customers/{customer_id}/orders/{order_id} Een order ophalen op id
{baseURL}/v1/customers/{customer_id}/orders/{order_id}/provisioningstatus Inrichtingsstatus van abonnement ophalen
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id} Orders beheren en een abonnement beheren
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/addons Een lijst met invoegtoepassingen voor een abonnement ophalen
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/azureEntitlements Een lijst met Azure-rechten voor een abonnement ophalen
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/registrationstatus Registratiestatus van abonnement ophalen
{baseURL}/v1/customers/{customer-tenant-id}/transfers Alle overdrachten van een klant ophalen
{baseURL}/v1/productUpgrades/{upgrade-id}/status Status van productupgrade ophalen
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/conversions Een lijst met aanbiedingen voor proefconversie ophalen
{baseURL}/v1/customers/{customer-tenant-id}/migrations/newcommerce/validate Een abonnement valideren voor migratie
{baseURL}/v1/customers/{customer-tenant-id}/migrations/newcommerce Een nieuwe commerce-migratie maken
{baseURL}/v1/customers/{customerId}/promotionEligibilities Een promotie-geschiktheid controleren

Antwoord op foutcode:

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

Voorbeeld van activiteitenlogboek

Voor aanbevolen procedures bij het analyseren van dagelijkse wijzigingen raden we u aan om een query uit te voeren op de auditrecord voor een specifieke dag.

In het antwoord krijgt u een resultaat met wijzigingen in het specifieke bewerkingstype. U kunt filteren op basis van de bewerking die u belangrijk vindt. Als u bijvoorbeeld geïnteresseerd bent in een nieuwe klant, kunt u operationType = "add_customer" bekijken.

De lijst met operationtype/resources vindt u in deze API-documenten.

Responsvoorbeeld

Aanvraag:

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 

Antwoord:

{ 

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

    } 

}