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:
- Reduzieren Sie den Parallelitätsgrad.
- Reduzieren Sie die Häufigkeit der Aufrufe.
- 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:
- Warten Sie die im Retry-After-Header angegebene Anzahl von Sekunden.
- Wiederholen Sie die Anforderung.
- Wenn die Anforderung erneut den Fehlercode 429 erhält, ist die Drosselung noch aktiv. Wiederholen Sie den Vorgang mit exponentiellem Backoff, verwenden Sie die empfohlene Retry-After-Header-Verzögerung und wiederholen Sie die Anforderung, bis sie erfolgreich ist.
- 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/customers/{customer-tenant-id} | Löschen eines Kundenkontos aus der Sandbox |
{baseURL}/v1/customers?size={size} | Abrufen einer Liste von Kunden |
{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: aaaa0000-bb11-2222-33cc-444444dddddd
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": "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": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"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": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"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"
}
}