Sdílet prostřednictvím


Pokyny k omezování rozhraní API pro partnery, kteří volají rozhraní API Partnerského centra

Microsoft implementuje omezování rozhraní API, které umožňuje konzistentnější výkon během časového období pro partnery, kteří volají rozhraní API Partnerského centra. Omezování stanovuje limit počtu požadavků na službu v určitém časovém intervalu, aby se zabránilo nadměrnému využití prostředků. Partnerské centrum je sice navržené tak, aby zvládalo vysoký objem požadavků, ale pokud se objeví nadměrný počet požadavků od několika málo partnerů, pomáhá omezování udržovat optimální výkon a spolehlivost pro všechny partnery.

Limity omezování se liší v závislosti na scénáři. Pokud například provádíte velký objem zápisů, je možnost omezování vyšší, než kdybyste prováděli jen čtení.

Co se stane, když dojde k omezování?

Když dojde k překročení prahové hodnoty omezování, Partnerské centrum omezuje všechny další žádosti od tohoto klienta po určitou dobu. Chování omezování závisí na typu a počtu požadavků.

Běžné scénáře omezování

Mezi nejčastější příčiny omezování klientů patří:

  • Velký počet žádostí o rozhraní API na ID partnerského tenanta: U některých rozhraní API Partnerského centra je omezování určeno ID partnerského tenanta. Příliš mnoho volání těchto rozhraní API na stejném ID partnerského tenanta vede k překročení prahové hodnoty omezování.
  • Velký počet požadavků pro rozhraní API na ID tenanta partnera na ID tenanta zákazníka: u jiných rozhraní API se omezení určuje kombinací ID tenanta partnera nebo ID tenanta zákazníka. V takových případech může být omezování příliš mnoho volání stejného ID tenanta zákazníka, zatímco volání jiných zákazníků můžou proběhnout úspěšně.

Osvědčené postupy, jak předcházet omezování

Programovací postupy, jako je neustálé dotazování prostředku, aby kontrolovaly aktualizace a pravidelně kontrolovaly kolekce prostředků, aby kontrolovaly nové nebo odstraněné prostředky, pravděpodobně vedou k omezování a snížení celkového výkonu. Souběžná volání rozhraní API můžou vést k vysokému počtu požadavků za jednotku času, což způsobí omezování požadavků. Místo toho byste měli použít sledování změn a oznámení o změnách. Kromě toho byste měli být schopni používat protokoly aktivit ke zjišťování změn. Další informace najdete v protokolech aktivit Partnerského centra. Důrazně doporučujeme, aby partneři zvážili použití rozhraní API protokolu aktivit, aby se zabránilo omezování. Podívejte se také na příklad použití protokolů aktivit níže.

Osvědčené postupy, jak zvládnout omezování

Pro zpracování omezování platí následující osvědčené postupy:

  • Snižte stupeň paralelismu.
  • Snižte frekvenci volání.
  • Vyhněte se okamžitým opakovaným pokusům, protože všechny požadavky se započítávají do limitů použití.

Při implementaci zpracování chyb k detekci omezování využijte kód chyby HTTP 429. Neúspěšná odpověď obsahuje hlavičku odpovědi Retry-After. Stažení požadavků s využitím zpoždění Retry-After představuje nejrychlejší způsob zotavení z omezování.

Pokud chcete použít opakování po zpoždění:

  1. Počkejte počet sekund zadaných v hlavičce Opakovat po.
  2. Zkuste požadavek zopakovat.
  3. Pokud se požadavek znovu nezdaří s kódem chyby 429, stále dochází k omezování. Zkuste to znovu s exponenciálním zpožďováním, použijte doporučené opakování po zpoždění a opakujte požadavek, dokud nebude úspěšný.
  4. Pokud používáte sadu SDK, při omezování požadavku se zobrazí výjimka se stavovým kódem 429. Použijte vlastnost RetryAfter v výjimce a opakujte požadavek po uplynutí času.

Rozhraní API aktuálně ovlivněná omezováním

Nakonec se omezí každé rozhraní API Partnerského centra, které volá koncový bod "api.partnercenter.microsoft.com/". Omezení omezení se v současné době vynucují pouze u níže uvedených rozhraní API. Partnerské centrum shromažďuje telemetrii pro jednotlivá rozhraní API a dynamicky upravuje limity omezování. Následující tabulka uvádí rozhraní API, ve kterých se aktuálně vynucuje omezování.

Operace Dokumentace k Partnerskému centru
{baseURL}/v1/customers/{customer_id}/orders vytvoření objednávky
{baseURL}/v1/customers/{customer-tenant-id}/subscriptions/{id-for-subscription}/upgrade přechod předplatného
{baseURL}/v1/customers/{customer-tenant-id}/orders/{order-id} zakoupení doplňku k předplatnému
{baseURL}/v1/customers/{customer-id}/carts/{cart-id} vytvoření košíku
{baseURL}/v1/customers/{customer-id}/carts/{cart-id}/checkout rezervace košíku
{baseURL}/v1/customers/{customer-id}/carts/{cart-id} aktualizace košíku
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/registrations registrace předplatného
{baseURL}/v1/productupgrades vytvoření entity upgradu produktu
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/conversions převod zkušebního předplatného na placené
{baseURL}/v1/customers/{customer-tenant-id} získání zákazníka podle ID
{baseURL}/v1/customers?size={size} získání seznamu zákazníků
{baseURL}/v1/productUpgrades/oprávněnost získání způsobilosti pro upgrade produktu
{baseURL}/v1/customers/{customer-tenant-id}/subscriptions/{id-for-subscription} správa předplatného
{baseURL}/v1/customers/{customer_id}/subscriptions get-all-of-a-customer-s-subscriptions
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id} Získání předplatného podle ID
{baseURL}/v1/customers/{customer_id}/orders Získání všech objednávek zákazníků
{baseURL}/v1/customers/{customer_id}/orders/{order_id} Získání objednávky podle ID
{baseURL}/v1/customers/{customer_id}/orders/{order_id}/provisioningstatus Získání stavu zřizování předplatného
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id} Správa objednávek a správa předplatného
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/addons Získání seznamu doplňků pro předplatné
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/azureEntitlements Získání seznamu nároků Azure pro předplatné
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/registrationstatus Získání stavu registrace předplatného
{baseURL}/v1/customers/{customer-tenant-id}/transfers Získání všech přenosů zákazníka
{baseURL}/v1/productUpgrades/{upgrade-id}/status Získání stavu upgradu produktu
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/conversions Získání seznamu nabídek pro převod zkušební verze
{baseURL}/v1/customers/{customer-tenant-id}/migrations/newcommerce/validate Ověření předplatného pro migraci
{baseURL}/v1/customers/{customer-tenant-id}/migrations/newcommerce Vytvoření nové komerční migrace
{baseURL}/v1/customers/{customerId}/promotionEligibilities Ověření způsobilosti pro zvýšení úrovně

Odpověď kódu chyby:

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

Příklad protokolu aktivit

Osvědčeným postupem při analýze denních změn doporučujeme dotazovat se na záznam auditu pro konkrétní den.

V odpovědi získáte výsledek se změnami konkrétního typu operace. Můžete filtrovat podle operace, o kterou vám záleží. Pokud vás například zajímá nově vytvořený zákazník, můžete se podívat na operationType = "add_customer".

Seznam typů operací a prostředků najdete v těchto dokumentech k rozhraní API.

Příklad odpovědi

Žádost:

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 

Odpověď:

{ 

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

    } 

}