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:
- Tunggu jumlah detik yang ditentukan di header Coba Lagi-Setelah.
- Coba lagi permintaannya.
- 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.
- 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"
}
}