API-torlódási útmutató a Partner Center API-kat hívó partnerek számára

A Microsoft API-szabályozást implementál, hogy konzisztensebb teljesítményt biztosítson a Partnerközpont API-kat hívogató partnerek számára. A szabályozás korlátozza a szolgáltatáshoz egy adott időintervallumon belül beérkező kérelmek számát, így megakadályozza az erőforrások túlzott mértékű felhasználását. Bár a Partnerközpont nagy mennyiségű kérelem kezelésére lett tervezve, ha túl sok kérelem érkezik be kevés partnertől, a szabályozás segít fenntartani az optimális teljesítményt és a megbízható működést az összes partner számára.

A szabályozási korlátok a forgatókönyvtől függően eltérőek lehetnek. Ha például nagy mennyiségű írást végez, a szabályozás lehetősége magasabb, mint ha csak olvasásokat végez.

Mi történik, ha szabályozás történik?

Ha túllép egy szabályozási küszöbértéket, a Partnerközpont egy időre korlátozza az ügyféltől érkező további kéréseket. A szabályozás viselkedése a kérelmek típusától és számától függ.

Gyakori szabályozási forgatókönyvek

Az ügyfelek szabályozásának leggyakoribb okai a következők:

  • Egy API-ra vonatkozó kérések nagy száma partnerbérlő-azonosítónként: egyes Partnerközpont API-k esetében a szabályozást a partnerbérlő azonosítója határozza meg. Ha túl sok hívás egyazon partnerbérlő-azonosítón lévő API-khoz, az túllépi a szabályozási küszöbértéket.
  • Az API-k ügyfélbérlő-azonosítónkénti azonosítónkénti nagyszámú kérése van: más API-k esetében a szabályozást a partnerbérlő-azonosító/ügyfélbérlő-azonosító kombináció határozza meg; ezekben az esetekben az ugyanazon ügyfél-bérlőazonosítón túl sok hívás szabályozást eredményez , míg a többi ügyféllel szembeni hívások sikeresek lehetnek.

A szabályozás elkerülésének ajánlott eljárásai

Az olyan programozási eljárások, mint például az erőforrások folyamatos lekérdezése frissítések keresése és az erőforrásgyűjtemények rendszeres ellenőrzése új vagy törölt erőforrások keresése érdekében, nagyobb valószínűséggel vezetnek szabályozáshoz, és csökkentik az általános teljesítményt. Az egyidejű API-hívások nagy számú kérést eredményezhetnek egységenként, ami a kérések szabályozását eredményezi. Ehelyett a változáskövetést és a változásértesítéseket kell használnia. Emellett képesnek kell lennie tevékenységnaplók használatára a változások észleléséhez. További információt a Partnerközpont tevékenységnaplóiban talál. Javasoljuk a partnereknek, hogy a hatékonyabb működés és a szabályozás elkerülése érdekében fontolja meg a tevékenységnapló API használatát. Lásd alább a tevékenységnaplók használatára vonatkozó példát is.

A szabályozás kezelésének ajánlott eljárásai

A szabályozás kezelésének ajánlott eljárásai a következők:

  • Csökkentse a párhuzamosság mértékét.
  • Csökkentse a hívások gyakoriságát.
  • Kerülje az azonnali újrapróbálkozást, mert minden kérés a használati korlátokon belül keletkezik.

Hibakezelés implementálásakor használja a 429-es HTTP-hibakódot a szabályozásészleléshez. A meghiúsult művelet válasza tartalmazza a „Retry-After” válaszfejlécet. A kérések „Retry-after” késleltetéssel való háttérbe küldése a szabályozásból történő helyreállítás leggyorsabb módja.

Az újrapróbálkozást követő késleltetés használata:

  1. Várja meg az Újrapróbálkozás után fejlécben megadott másodpercek számát.
  2. Ismételje meg a kérést.
  3. Ha a kérés ismét meghiúsul egy 429-re vonatkozó hibakóddal, akkor továbbra is szabályozva lesz. Próbálkozzon újra exponenciális visszalépéssel, használja az ajánlott újrapróbálkozási késleltetést, és próbálkozzon újra a kéréssel, amíg sikeres nem lesz.
  4. Ha az SDK-t használja, kivételt kap a 429-re vonatkozó állapotkóddal, amikor a kérés szabályozása folyamatban van. Használja a RetryAfter tulajdonságot a kivételben, és próbálkozzon újra a kéréssel az idő leteltét követően.

A szabályozás által jelenleg érintett API-k

A végpontot "api.partnercenter.microsoft.com/" hívásokat hívó összes Partner Center API szabályozás alatt áll. Jelenleg a szabályozási korlátok csak az alább felsorolt API-kra vonatkoznak. A Partnerközpont összegyűjti az egyes API-k telemetriáját, és dinamikusan módosítja a szabályozási korlátokat. Az alábbi táblázat azokat az API-kat sorolja fel, amelyeken a szabályozás jelenleg kényszerítve van.

Művelet Partnerközpont dokumentációja
{baseURL}/v1/customers/{customer_id}/orders rendelés létrehozása
{baseURL}/v1/customers/{customer-tenant-id}/subscriptions/{id-for-subscription}/upgrades előfizetés áttűnés
{baseURL}/v1/customers/{customer-tenant-id}/orders/{order-id} bővítmény vásárlása előfizetéshez
{baseURL}/v1/customers/{customer-id}/carts/{cart-id} kosár létrehozása
{baseURL}/v1/customers/{customer-id}/carts/{cart-id}/checkout kosár kivétele
{baseURL}/v1/customers/{customer-id}/carts/{cart-id} kosár frissítése
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/registrations előfizetés regisztrálása
{baseURL}/v1/productupgrades termékfrissítési entitás létrehozása
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/conversions próbaverziós előfizetés konvertálása fizetőssé
{baseURL}/v1/customers/{customer-tenant-id} ügyfél lekérése azonosító alapján
{baseURL}/v1/productUpgrades/eligibility termékfrissítésre való jogosultság lekérése
{baseURL}/v1/customers/{customer-tenant-id}/subscriptions/{id-for-subscription} előfizetés kezelése
{baseURL}/v1/customers/{customer_id}/subscriptions teljes körű ügyfél-előfizetések lekérése
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id} Előfizetés lekérése azonosító alapján
{baseURL}/v1/customers/{customer_id}/orders Az összes ügyfélrendelés lekérése
{baseURL}/v1/customers/{customer_id}/orders/{order_id} Rendelés lekérése azonosító alapján
{baseURL}/v1/customers/{customer_id}/orders/{order_id}/provisioningstatus Előfizetés kiépítési állapotának lekérése
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id} Rendelések kezelése és előfizetés kezelése
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/addons Előfizetés bővítményeinek listájának lekérése
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/azureEntitlements Az előfizetésHez tartozó Azure-jogosultságok listájának lekérése
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/registrationstatus Előfizetés-regisztráció állapotának lekérése
{baseURL}/v1/customers/{customer-tenant-id}/transfers Az ügyfél összes átvitelének lekérése
{baseURL}/v1/productUpgrades/{upgrade-id}/status Termékfrissítés állapotának lekérése
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/conversions Próbakonverziós ajánlatok listájának lekérése
{baseURL}/v1/customers/{customer-tenant-id}/migrations/newcommerce/validate Előfizetés ellenőrzése a migráláshoz
{baseURL}/v1/customers/{customer-tenant-id}/migrations/newcommerce Új kereskedelmi felületi migrálás létrehozása
{baseURL}/v1/customers/{customerId}/promotionEligibilities Promóciós jogosultság ellenőrzése

Hibakód válasza:

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élda tevékenységnaplóra

A napi változások elemzésének ajánlott eljárásaihoz javasoljuk, hogy egy adott napra vonatkozóan kérdezze le az auditrekordot.

A válaszban egy adott művelettípus módosításait tartalmazó eredményt kap. A kívánt művelet alapján szűrhet. Ha például egy újonnan létrehozott ügyfél érdekli, tekintse meg az operationType = "add_customer" elemet.

Az operationtype/resources listája ezekben az API-dokumentumokban található.

Példa válaszra

Kérelem:

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 

Válasz:

{ 

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

    } 

}