Mendiagnosis dan memecahkan masalah pengecualian waktu tunggu permintaan di Azure Cosmos DB
BERLAKU UNTUK: NoSQL
Kesalahan HTTP 408 terjadi jika SDK tidak dapat menyelesaikan permintaan sebelum batas waktu terjadi.
Penting untuk memastikan desain aplikasi mematuhi panduan untuk merancang aplikasi tangguh dengan SDK Azure Cosmos DB untuk memastikannya bereaksi dengan benar terhadap kondisi jaringan yang berbeda. Aplikasi Anda harus memiliki percobaan ulang untuk kesalahan waktu habis karena ini biasanya diharapkan dalam sistem terdistribusi.
Saat mengevaluasi kasus kesalahan waktu habis:
- Apa dampak yang diukur dalam volume operasi yang terpengaruh dibandingkan dengan operasi yang berhasil? Apakah itu ada dalam SLA layanan?
- Apakah latensi/ketersediaan P99 terpengaruh?
- Apakah kegagalan memengaruhi semua instans aplikasi Anda atau hanya sebagian? Ketika masalah direduksi menjadi subset instans, biasanya masalah itu terkait dengan instans tersebut.
Menyesuaikan batas waktu pada SDK .NET Azure Cosmos DB
SDK memiliki dua alternatif berbeda untuk mengontrol batas waktu, masing-masing dengan lingkup yang berbeda.
Batas waktu tingkat permintaan
Konfigurasi CosmosClientOptions.RequestTimeout
(atau ConnectionPolicy.RequestTimeout
untuk SDK v2) memungkinkan Anda mengatur batas waktu untuk permintaan jaringan setelah permintaan meninggalkan SDK dan berada di jaringan, hingga respons diterima.
Konfigurasi CosmosClientOptions.OpenTcpConnectionTimeout
(atau ConnectionPolicy.OpenTcpConnectionTimeout
untuk SDK v2) memungkinkan Anda mengatur batas waktu untuk waktu yang dihabiskan untuk membuka koneksi awal. Setelah koneksi dibuka, permintaan berikutnya akan menggunakan koneksi.
Operasi yang dimulai oleh pengguna dapat mencakup beberapa permintaan jaringan, misalnya, mencoba kembali. Kedua konfigurasi ini adalah per permintaan, bukan end-to-end untuk operasi.
TokenPembatalan
Semua operasi asinkron di SDK memiliki parameter pilihan TokenPembatalan. Parameter CancellationToken ini digunakan di seluruh operasi, di semua permintaan jaringan dan percobaan ulang. Di sela-sela permintaan jaringan, token pembatalan dapat diperiksa dan operasi dibatalkan jika token terkait telah kedaluwarsa. Token pembatalan harus digunakan untuk menentukan perkiraan waktu habis yang diharapkan pada lingkup operasi.
Catatan
Parameter CancellationToken
adalah mekanisme di mana pustaka akan memeriksa pembatalan jika hal itu tidak menyebabkan keadaan tidak valid. Operasi ini mungkin tidak membatalkan dengan tepat kapan waktu yang ditentukan dalam pembatalan sudah habis. Sebaliknya, operasi akan dibatalkan setelah waktunya habis dan dirasa aman.
Langkah-langkah pemecahan masalah
Daftar berikut ini berisi penyebab dan solusi yang diketahui untuk pengecualian waktu tunggu permintaan.
CosmosOperationCanceledException
Jenis pengecualian ini kerap muncul ketika aplikasi Anda meneruskan CancellationTokens ke operasi SDK. SDK memeriksa status CancellationToken
coba lagi di sela-sela proses tersebut, dan jika CancellationToken
dibatalkan, SDK akan membatalkan operasi saat ini dengan pengecualian ini.
Pengecualian Message
/ ToString()
juga akan menunjukkan status CancellationToken
Anda melalui Cancellation Token has expired: true
dan juga akan berisi Diagnostik yang berisi konteks pembatalan permintaan yang sedang diproses.
Pengecualian ini sifatnya aman dan Anda dapat mencoba kembali, serta dapat diperlakukan sebagai batas waktu dari perspektif percobaan kembali.
Solusi
Verifikasi waktu yang dikonfigurasi di CancellationToken
Anda, pastikan waktunya lebih besar dari RequestTimeout dan CosmosClientOptions.OpenTcpConnectionTimeout (jika Anda menggunakan mode Langsung).
Jika waktu yang tersedia di CancellationToken
kurang dari waktu habis yang dikonfigurasi, dan SDK mengalami masalah konektivitas yang bersifat sementara, SDK tidak akan dapat mencoba ulang dan akan memunculkan CosmosOperationCanceledException
.
Pemanfaatan CPU tinggi
Penggunaan CPU tinggi adalah kasus yang paling umum. Agar latensi optimal, penggunaan CPU harus sekitar 40 persen. Gunakan 10 detik sebagai interval untuk memantau penggunaan maksimum (bukan rata-rata) CPU. Lonjakan CPU lebih umum terjadi pada kueri lintas-partisi yang mungkin melakukan banyak koneksi untuk satu kueri.
Waktu habis akan berisi Diagnostik, yang berisi:
"systemHistory": [
{
"dateUtc": "2021-11-17T23:38:28.3115496Z",
"cpu": 16.731,
"memory": 9024120.000,
"threadInfo": {
"isThreadStarving": "False",
....
}
},
{
"dateUtc": "2021-11-17T23:38:28.3115496Z",
"cpu": 16.731,
"memory": 9024120.000,
"threadInfo": {
"isThreadStarving": "False",
....
}
},
...
]
- Jika nilai
cpu
melebihi 70%, waktu habis kemungkinan disebabkan oleh habisnya CPU. Dalam hal ini, solusinya adalah menyelidiki sumber pemanfaatan CPU yang tinggi dan menguranginya, atau menskalakan mesin ke ukuran sumber daya yang lebih besar. - Apabila node
threadInfo/isThreadStarving
memiliki nilaiTrue
, penyebabnya adalah habisnya alur. Solusi untuk hal ini adalah menyelidiki sumber dari kekurangan utas (utas yang berpotensi terkunci), atau memperbesar skala ukuran sumber daya komputer. - Jika waktu
dateUtc
di antara pengukuran tidak berada di kisaran 10 detik, artinya ini juga akan menunjukkan adanya ketidaksesuaian pada kumpulan rangkaian. CPU diukur sebagai Tugas independen yang diantrekan dalam kumpulan rangkaian setiap 10 detik, sehingga jika waktu di antara setiap pengukurannya lebih lama, artinya Tugas asinkron tidak bisa diproses secara tepat waktu. Skenario-skenario paling umum adalah saat memblokir panggilan melalui kode asinkronisasi dalam kode aplikasi.
Solusi
Aplikasi klien yang menggunakan SDK harus ditingkatkan atau diluaskan.
Ketersediaan soket atau port mungkin rendah
Saat berjalan di Azure, klien yang menggunakan SDK .NET dapat kehabisan port Azure SNAT (PAT).
Solusi 1
Jika Anda menjalankan Azure VM, ikuti panduan kehabisan port SNAT.
Solusi 2
Jika Anda menjalankan Azure App Service, ikuti panduan pemecahan masalah kesalahan koneksi dan menggunakan diagnostik Azure App Service.
Solusi 3
Jika Anda menjalankan Azure Functions, pastikan Anda mengikuti rekomendasi Azure Functions untuk mempertahankan klien database tunggal atau statis untuk semua layanan yang terlibat (termasuk Azure Cosmos DB). Periksa batas layanan berdasarkan jenis dan ukuran hosting Aplikasi Fungsi Anda.
Solusi 4
Jika Anda menggunakan proksi HTTP, pastikan proksi tersebut dapat mendukung jumlah koneksi yang dikonfigurasi di SDK ConnectionPolicy
. Jika tidak, Anda akan menghadapi masalah koneksi.
Membuat beberapa instans klien
Membuat beberapa instans klien dapat menyebabkan masalah ketidaksesuaian dan batas waktu koneksi. Diagnostik berisi dua properti yang relevan:
{
"NumberOfClientsCreated":X,
"NumberOfActiveClients":Y,
}
NumberOfClientsCreated
melacak berapa kali dibuat CosmosClient
dalam AppDomain yang sama, dan NumberOfActiveClients
melacak klien aktif (tidak dibuang). Harapannya adalah bahwa jika pola singleton diikuti, X
akan cocok dengan jumlah akun yang bekerja dengan aplikasi dan itu X
sama Y
dengan .
Jika X
lebih besar dari Y
, itu berarti aplikasi membuat dan membuang instans klien. Ini dapat menyebabkan pertikaian koneksi dan/atau ketidakcocokan CPU.
Solusi
Ikuti tips performa, dan gunakan satu instans CosmosClient per akun di seluruh proses. Hindari membuat dan membuang klien.
Kunci partisi panas
Azure Cosmos DB mendistribusikan throughput yang disediakan secara merata di seluruh partisi fisik. Ketika ada partisi panas, satu atau lebih kunci partisi logis fisik mengonsumsi semua Unit Permintaan partisi fisik per detik (RU/s). Pada saat yang sama, RU/s pada partisi fisik lainnya tidak akan digunakan. Sebagai gejala, total RU/s yang dikonsumsi akan kurang dari keseluruhan RU/s yang disediakan di database atau kontainer, tetapi pembatasan masih akan terlihat (429s) pada permintaan terhadap kunci partisi logis panas. Gunakan Metrik konsumsi RU Yang Dinormalisasi untuk melihat apakah beban kerja mengalami partisi panas.
Solusi
Pilih kunci partisi yang baik untuk mendistribusikan volume permintaan dan penyimpanan secara merata. Pelajari cara mengubah kunci partisi Anda.
Tingkat konkurensi tinggi
Aplikasi ini melakukan konkurensi tingkat tinggi, yang dapat menyebabkan ketidaksesuaian di saluran.
Solusi
Aplikasi klien yang menggunakan SDK harus ditingkatkan atau diluaskan.
Permintaan atau respons besar
Permintaan atau respons besar dapat menyebabkan pemblokiran head-of-line di saluran dan memperparah ketidaksesuaian, bahkan dengan tingkat konkurensi yang relatif rendah.
Solusi
Aplikasi klien yang menggunakan SDK harus ditingkatkan atau diluaskan.
Tingkat kegagalan berada dalam SLA Azure Cosmos DB
Aplikasi harus dapat menangani kegagalan sementara dan mencoba kembali bila perlu. Pengecualian 408 apa pun tidak dicoba lagi karena di jalur pembuatan tidak mungkin untuk mengetahui apakah layanan membuat item atau tidak. Mengirim item yang sama lagi untuk pembuatan akan menyebabkan pengecualian konflik. Logika bisnis aplikasi pengguna mungkin memiliki logika kustom untuk menangani konflik, yang akan keluar dari ambiguitas item yang ada versus konflik dari coba lagi buat.
Tingkat kegagalan melanggar SLA Azure Cosmos DB
Hubungi Dukungan Azure.
Langkah berikutnya
- Mendiagnosis dan memecahkan masalah saat Anda menggunakan SDK .NET Azure Cosmos DB.
- Pelajari tentang panduan performa untuk .NET v3 dan .NET v2.