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í:
- Počkejte počet sekund zadaných v hlavičce Opakovat po.
- Zkuste požadavek zopakovat.
- 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ý.
- 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"
}
}