Anleitung zur API-Drosselung für Partner, die Partner Center-APIs aufrufen

Microsoft implementiert die API-Einschränkung, um eine konsistentere Leistung innerhalb eines Zeitraums für Partner zu ermöglichen, die partner Center-APIs aufrufen. Durch die Drosselung wird die Anzahl von Anforderungen für einen Dienst in einer Zeitspanne begrenzt, um eine übermäßige Nutzung von Ressourcen zu verhindern. Zwar ist Partner Center darauf ausgelegt, eine große Anzahl von Anforderungen zu verarbeiten, doch kann bei einer übergroßen Anzahl von Anforderungen einiger Partner durch eine Drosselung die optimale Leistung und Zuverlässigkeit für alle Partner aufrechterhalten werden.

Die Grenzwerte für die Drosselung sind je nach Szenario unterschiedlich. Wenn Sie beispielsweise eine große Anzahl von Schreibvorgängen durchführen, ist die Möglichkeit zur Drosselung höher als wenn Sie nur Lesevorgänge ausführen.

Was geschieht, wenn die Drosselung auftritt?

Wenn ein Drosselungsschwellenwert überschritten wird, schränkt Partner Center alle weiteren Anforderungen von diesem Client für einen bestimmten Zeitraum ein. Das Einschränkungsverhalten hängt vom Typ und der Anzahl der Anforderungen ab.

Häufige Szenarien für die Drosselung

Zu den häufigsten Ursachen für die Drosselung von Clients gehören:

  • Eine große Anzahl von Anforderungen für eine API pro Partnermandanten-ID: Bei einigen Partner Center-APIs wird die Drosselung durch die Partnermandanten-ID bestimmt. Zu viele Aufrufe dieser APIs für dieselbe Partnermandanten-ID führen zu einer Überschreitung des Drosselungsschwellenwerts.
  • Eine große Anzahl von Anforderungen für eine API pro Partnermandanten-ID pro Kundenmandanten-ID: Für andere APIs wird die Drosselung durch die Kombination aus Partnermandanten-ID/Kundenmandanten-ID bestimmt. In diesen Fällen führt zu zu vielen Aufrufen gegen dieselbe Kundenmandanten-ID zu Drosselung – während Aufrufe für andere Kunden möglicherweise erfolgreich sind.

Best practices to avoid throttling (Bewährte Methoden zum Vermeiden der Drosselung)

Programmierpraktiken, z. B. das kontinuierliche Abrufen einer Ressource, um nach Updates zu suchen und ressourcensammlungen regelmäßig zu überprüfen, um nach neuen oder gelöschten Ressourcen zu suchen, sind wahrscheinlicher, dass sie zu Drosselungen führen und die Gesamtleistung beeinträchtigt. Gleichzeitige API-Aufrufe können zu einer hohen Anzahl von Anforderungen pro Einheitszeit führen, was dazu führt, dass Anforderungen gedrosselt werden. Sie sollten stattdessen Änderungsnachverfolgung und Änderungsbenachrichtigungen verwenden. Darüber hinaus sollten Sie in der Lage sein, Aktivitätsprotokolle zum Erkennen von Änderungen zu verwenden. Weitere Informationen finden Sie in den Partner Center-Aktivitätsprotokollen. Wir empfehlen Partnern dringend, die Verwendung der Aktivitätsprotokoll-API für mehr Effizienz zu erwägen und Drosselung zu vermeiden. Siehe auch das Beispiel für die Verwendung von Aktivitätsprotokollen unten.

Bewährte Methoden zum Behandeln der Drosselung

Im Folgenden sind bewährte Methoden für die Behandlung von Drosselung aufgeführt:

  • Verringern Sie den Grad der Parallelität.
  • Verringern Sie die Häufigkeit von Anrufen.
  • Vermeiden Sie sofortige Wiederholungsversuche, da alle Anforderungen in Ihren Nutzungsgrenzwerten auflaufen.

Verwenden Sie bei der Implementierung der Fehlerbehandlung den HTTP-Fehlercode 429 zur Drosselungserkennung. Die Fehlerantwort enthält den Retry-After-Antwortheader. Eine Drosselung lässt sich am schnellsten durch Zurückstellen von Anforderungen mit Retry-After-Verzögerung behandeln.

So verwenden Sie die Wiederholungsverzögerung:

  1. Warten Sie die Im Header "Retry-After" angegebene Anzahl von Sekunden.
  2. Wiederholen Sie die Anforderung.
  3. Wenn die Anforderung erneut mit einem Fehlercode von 429 fehlschlägt, werden Sie weiterhin gedrosselt. Wiederholen Sie den Vorgang mit exponentiellem Backoff, verwenden Sie die empfohlene Retry-After-Verzögerung, und wiederholen Sie die Anforderung, bis sie erfolgreich ist.
  4. Wenn Sie das SDK verwenden, erhalten Sie eine Ausnahme mit dem Statuscode 429, wenn Ihre Anforderung gedrosselt wird. Verwenden Sie die RetryAfter-Eigenschaft in der Ausnahme, und wiederholen Sie die Anforderung nach ablaufen der Zeit.

ApIs, die derzeit von Drosselung betroffen sind

Am Ende wird jede einzelne Partner Center-API, die den Endpunkt "api.partnercenter.microsoft.com/" aufruft, gedrosselt. Derzeit werden die Einschränkungsgrenzwerte nur für die unten aufgeführten APIs erzwungen. Partner Center sammelt die Telemetrie auf den einzelnen APIs und passt die Einschränkungsgrenzwerte dynamisch an. In der folgenden Tabelle sind die APIs aufgeführt, in denen die Drosselung derzeit erzwungen wird.

Vorgang Partner-Center-Dokumentation
{baseURL}/v1/customers/{customer_id}/orders Erstellen einer Bestellung
{baseURL}/v1/customers/{customer-tenant-id}/subscriptions/{id-for-subscription}/upgrades Übergang eines Abonnements
{baseURL}/v1/customers/{customer-tenant-id}/orders/{order-id} Kauf eines Add-Ons für ein Abonnement
{baseURL}/v1/customers/{customer-id}/carts/{cart-id} Erstellen eines Einkaufswagens
{baseURL}/v1/customers/{customer-id}/carts/{cart-id}/checkout Auschecken eines Einkaufswagens
{baseURL}/v1/customers/{customer-id}/carts/{cart-id} Aktualisieren eines Einkaufswagens
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/registrations Registrieren eines Abonnements
{baseURL}/v1/productupgrades Erstellen einer Produktupgradeentität
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/conversions Konvertieren eines Testabonnements in kostenpflichtige Abonnements
{baseURL}/v1/customers/{customer-tenant-id} Abrufen eines Kunden nach ID
{baseURL}/v1/productUpgrades/berechtigung Anspruch auf Produktupgrade erhalten
{baseURL}/v1/customers/{customer-tenant-id}/subscriptions/{id-for-subscription} Abonnement verwalten
{baseURL}/v1/customers/{customer_id}/subscriptions get-all-of-a-customer-s-subscriptions
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id} Abrufen eines Abonnements nach ID
{baseURL}/v1/customers/{customer_id}/orders Abrufen aller Kundenaufträge
{baseURL}/v1/customers/{customer_id}/orders/{order_id} Abrufen eines Auftrags mittels ID
{baseURL}/v1/customers/{customer_id}/orders/{order_id}/provisioningstatus Abrufen des Abonnementbereitstellungsstatus
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id} Verwalten von Aufträgen und Verwalten eines Abonnements
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/addons Abrufen einer Liste von Add-Ons für ein Abonnement
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/azureEntitlements Abrufen einer Liste von Azure-Berechtigungen für ein Abonnement
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/registrationstatus Abrufen des Abonnementregistrierungsstatus
{baseURL}/v1/customers/{customer-tenant-id}/transfers Abrufen aller Übertragungen eines Kunden
{baseURL}/v1/productUpgrades/{upgrade-id}/status Abrufen des Status der Produktaktualisierung
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/conversions Abrufen einer Liste von Testwechselangeboten
{baseURL}/v1/customers/{customer-tenant-id}/migrations/newcommerce/validate Überprüfen eines Abonnements für die Migration
{baseURL}/v1/customers/{customer-tenant-id}/migrations/newcommerce Erstellen einer Migration zum neuen E-Commerce-Verfahren
{baseURL}/v1/customers/{customerId}/promotionEligibilities Überprüfen der Berechtigung für eine Werbeaktion

Fehlercodeantwort:

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

Beispiel für ein Aktivitätsprotokoll

Um die täglichen Änderungen zu analysieren, empfiehlt es sich, den Überwachungsdatensatz für einen bestimmten Tag zu abfragen.

In der Antwort erhalten Sie ein Ergebnis mit Änderungen an einem bestimmten Vorgangstyp. Sie können basierend auf dem vorgang filtern, den Sie interessieren. Wenn Sie beispielsweise an einem neu erstellten Kunden interessiert sind, können Sie operationType = "add_customer" betrachten.

Eine Liste der Vorgangstypen/Ressourcen finden Sie in diesen API-Dokumenten.

Beispielantwort

Anforderung:

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 

Antwort:

{ 

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

    } 

}