Bagikan melalui


Panduan pembatasan API untuk mitra yang memanggil API Pusat Mitra

Microsoft menerapkan pembatasan API untuk memungkinkan performa yang lebih konsisten dalam rentang waktu bagi mitra yang memanggil API Pusat Mitra. Pembatasan membatasi jumlah permintaan ke layanan dalam rentang waktu guna mencegah penggunaan sumber daya yang berlebihan. Meskipun Pusat Mitra dirancang untuk menangani volume permintaan yang tinggi, jika terdapat jumlah permintaan yang luar biasa dari beberapa mitra, pembatasan membantu menjaga performa serta keandalan yang optimal untuk semua mitra.

Batas pembatasan bervariasi berdasarkan skenario. Misalnya, jika Anda melakukan penulisan dalam volume besar, kemungkinan untuk pembatasan lebih tinggi daripada jika Anda hanya melakukan bacaan.

Apa yang terjadi ketika pembatasan terjadi?

Ketika ambang batas pembatasan terlampaui, Pusat Mitra membatasi permintaan lebih lanjut dari klien tersebut untuk jangka waktu tertentu. Perilaku pembatasan tergantung pada jenis dan jumlah permintaan.

Skenario pembatasan umum

Penyebab paling umum pembatasan klien meliputi:

  • Sejumlah besar permintaan untuk API per ID Penyewa Mitra: untuk beberapa API Pusat Mitra, pembatasan ditentukan oleh ID Penyewa Mitra. Terlalu banyak panggilan ke API tersebut pada ID Penyewa Mitra yang sama menghasilkan melebihi ambang batas pembatasan.
  • Sejumlah besar permintaan untuk API per ID Penyewa Mitra per ID Penyewa Pelanggan: untuk API lain, pembatasan ditentukan oleh kombinasi ID Penyewa Mitra/ID Penyewa Pelanggan; dalam kasus tersebut, melakukan terlalu banyak panggilan terhadap ID penyewa pelanggan yang sama menghasilkan pembatasan - sementara panggilan terhadap pelanggan lain mungkin berhasil.

Praktik terbaik untuk menghindari pembatasan

Praktik pemrograman, seperti terus melakukan polling sumber daya untuk memeriksa pembaruan dan secara teratur memindai koleksi sumber daya untuk memeriksa sumber daya baru atau yang dihapus, lebih mungkin menyebabkan pembatasan dan menurunkan performa keseluruhan. Panggilan API bersamaan dapat menyebabkan tingginya jumlah permintaan per waktu unit, yang menyebabkan permintaan dibatasi. Sebagai gantinya, Anda harus menggunakan pelacakan perubahan dan mengubah pemberitahuan. Selain itu, Anda harus dapat menggunakan log aktivitas untuk mendeteksi perubahan. Untuk informasi selengkapnya, lihat Log aktivitas Pusat Mitra. Kami sangat menyarankan mitra untuk mempertimbangkan penggunaan API log aktivitas untuk efisiensi yang lebih tinggi dan untuk menghindari pembatasan. Lihat juga contoh penggunaan log aktivitas, di bawah ini.

Praktik terbaik untuk menangani pembatasan

Berikut ini adalah praktik terbaik untuk menangani pembatasan:

  • Kurangi tingkat paralelisme.
  • Kurangi frekuensi panggilan.
  • Hindari percobaan ulang segera karena semua permintaan bertambah berdasarkan batas penggunaan Anda.

Ketika Anda menerapkan penanganan kesalahan, gunakan kode galat HTTP 429 untuk mendeteksi pembatasan. Respons yang gagal mencakup header respons Retry-After. Mencadangkan permintaan menggunakan penundaan Retry-After adalah cara tercepat untuk pulih dari pembatasan.

Untuk menggunakan penundaan Coba Lagi setelah:

  1. Tunggu jumlah detik yang ditentukan di header Coba Lagi-Setelah.
  2. Coba lagi permintaannya.
  3. Jika permintaan gagal lagi dengan kode kesalahan 429, Anda masih dibatasi. Coba lagi dengan backoff Eksponensial, gunakan penundaan Coba Lagi Setelah yang direkomendasikan dan coba lagi permintaan hingga berhasil.
  4. Jika Anda menggunakan SDK, Anda menerima pengecualian dengan kode status 429 saat permintaan Anda dibatasi. Gunakan properti RetryAfter dalam pengecualian dan coba lagi permintaan setelah waktu berlalu.

API saat ini dipengaruhi oleh pembatasan

Pada akhirnya, setiap API Pusat Mitra yang memanggil titik akhir "api.partnercenter.microsoft.com/" dibatasi. Saat ini, batas pembatasan hanya diberlakukan pada API yang tercantum di bawah ini. Pusat Mitra mengumpulkan telemetri pada setiap API dan secara dinamis menyesuaikan batas pembatasan. Tabel berikut mencantumkan API tempat pembatasan saat ini diberlakukan.

Operasi Dokumentasi Pusat Mitra
{baseURL}/v1/customers/{customer_id}/orders membuat pesanan
{baseURL}/v1/customers/{customer-tenant-id}/subscriptions/{id-for-subscription}/upgrades transisi langganan
{baseURL}/v1/customers/{customer-tenant-id}/orders/{order-id} membeli addon ke langganan
{baseURL}/v1/customers/{customer-id}/carts/{cart-id} membuat kelir
{baseURL}/v1/customers/{customer-id}/carts/{cart-id}/checkout checkout kelir
{baseURL}/v1/customers/{customer-id}/carts/{cart-id} memperbarui kelir
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/registrations mendaftarkan langganan
{baseURL}/v1/productupgrades membuat entitas peningkatan produk
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/conversions mengonversi langganan uji coba menjadi berbayar
{baseURL}/v1/customers/{customer-tenant-id} mendapatkan pelanggan berdasarkan ID
{baseURL}/v1/productUpgrades/eligibility mendapatkan kelayakan untuk peningkatan produk
{baseURL}/v1/customers/{customer-tenant-id}/subscriptions/{id-for-subscription} mengelola langganan
{baseURL}/v1/customers/{customer_id}/subscriptions get-all-of-a-customer-s-subscriptions
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id} Mendapatkan langganan menurut ID
{baseURL}/v1/customers/{customer_id}/orders Mendapatkan semua pesanan pelanggan
{baseURL}/v1/customers/{customer_id}/orders/{order_id} Mendapatkan pesanan berdasarkan ID
{baseURL}/v1/customers/{customer_id}/orders/{order_id}/provisioningstatus Mendapatkan status provisi langganan
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id} Mengelola pesanan dan mengelola langganan
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/addons Mendapatkan daftar add-on untuk langganan
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/azureEntitlements Mendapatkan daftar pemberian izin Azure untuk langganan
{baseURL}/v1/customers/{customer_id}/subscriptions/{subscription_id}/registrationstatus Mendapatkan status pendaftaran langganan
{baseURL}/v1/customers/{customer-tenant-id}/transfers Dapatkan semua transfer pelanggan
{baseURL}/v1/productUpgrades/{upgrade-id}/status Dapatkan status peningkatan produk
{baseURL}/v1/customers/{customer-id}/subscriptions/{subscription-id}/conversions Mendapatkan daftar penawaran konversi uji coba
{baseURL}/v1/customers/{customer-tenant-id}/migrations/newcommerce/validate Memvalidasi langganan untuk migrasi
{baseURL}/v1/customers/{customer-tenant-id}/migrations/newcommerce Membuat migrasi perdagangan baru
{baseURL}/v1/customers/{customerId}/promotionEligibilities Memverifikasi kelayakan promosi

Respons kode kesalahan:

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

Contoh log aktivitas

Untuk praktik terbaik dalam menganalisis perubahan harian, kami sarankan Anda mengkueri catatan audit untuk hari tertentu.

Dalam respons, Anda mendapatkan hasil dengan perubahan pada jenis operasi tertentu. Anda dapat memfilter berdasarkan operasi yang Anda pedulikan. Misalnya, jika Anda tertarik dengan pelanggan yang baru dibuat, Anda dapat melihat operationType = "add_customer".

Daftar jenis operasi/sumber daya dapat ditemukan di dokumen API ini.

Contoh tanggapan

Permintaan:

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 

Respons:

{ 

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

    } 

}