Mengapa pemindaian DynamoDB saya begitu cepat dengan hanya 1 unit kapasitas baca yang disediakan?
Saya membuat meja dengan 1346 item, setiap item berukuran kurang dari 4KB. Saya menyediakan 1 unit kapasitas baca, jadi saya mengharapkan rata-rata 1 item dibaca per detik. Namun, pemindaian sederhana dari semua 1346 item kembali dengan segera.
Apa yang kulewatkan di sini?
Jawaban
Ini kemungkinan turun ke kapasitas burst di mana Anda mendapatkan kapasitas Anda selama 300 detik untuk digunakan untuk tindakan burstable (seperti memindai seluruh tabel).
Ini berarti jika Anda menggunakan semua kredit ini, interaksi lain akan terganggu karena mereka tidak memiliki cukup kapasitas yang tersedia untuk mereka.
Anda dapat melihat jumlah WCU / RCU yang digunakan baik melalui metrik CloudWatch atau dalam antarmuka DynamoDB itu sendiri (melalui tab Metrik).
Anda tidak memberikan ukuran untuk entri Anda kecuali untuk mengatakan "setiap item kurang dari 4KB". Seberapa kurang?
1 RCU akan mendukung 2 pembacaan yang akhirnya konsisten per detik item hingga 4KB.
Dengan kata lain, dengan 1 RCU dan pada akhirnya pembacaan yang konsisten, Anda dapat membaca 8 KB data per detik.
Jika record Anda 4KB, maka Anda mendapatkan 2 record / dtk
1KB, 8 / dtk
512B, 16 / dtk
256B, 32 / dtk
Jadi kemampuan "burst" yang telah disebutkan memungkinkan Anda menggunakan 55 RCU. Tetapi ukuran kecil dari catatan Anda memungkinkan 55 RCU untuk mengembalikan data "segera"
Ada dua hal yang menguntungkan Anda di sini - satu adalah bahwa Scan
operasi membutuhkan RCU yang jauh lebih sedikit daripada yang Anda kira untuk barang-barang kecil. Hal lainnya adalah "kapasitas meledak". Saya akan mencoba menjelaskan keduanya:
The halaman harga DynamoDB mengatakan bahwa "Untuk item hingga 4 KB, satu RCU dapat melakukan dua permintaan membaca akhirnya konsisten per detik.". Ini menunjukkan bahwa meskipun item berukuran 10 byte, biayanya setengah RCU untuk membacanya dengan konsistensi akhir. Namun, meskipun mereka tidak menyatakannya di mana pun, biaya ini hanya berlaku untuk GetItem
operasi mengambil satu item. Di a Scan
atau Query
, ternyata Anda tidak membayar secara terpisah untuk setiap item. Sebaliknya, operasi ini memindai data yang disimpan di disk secara berurutan, dan Anda membayar sejumlah data yang dibaca. Jika Anda memiliki 1000 item kecil dan ukuran total yang harus dibaca DynamoDB dari disk adalah 80KB, Anda akan membayar 80KB / 4KB / 2, atau 10 RCU, bukan 500 RCU.
Ini menjelaskan mengapa Anda membaca 1346 item, dan hanya mengukur 55 RCU, bukan 1346/2 = 673.
Hal kedua yang menguntungkan Anda adalah DynamoDB memiliki kemampuan "burst capacity", yang dijelaskan di sini :
DynamoDB saat ini menyimpan hingga 5 menit (300 detik) kapasitas baca dan tulis yang tidak digunakan. Selama lonjakan aktivitas baca atau tulis sesekali, unit kapasitas ekstra ini dapat dikonsumsi dengan cepat — bahkan lebih cepat daripada kapasitas throughput yang disediakan per detik yang telah Anda tentukan untuk tabel Anda.
Jadi, jika database Anda ada selama 5 menit sebelum permintaan Anda, DynamoDB menghemat 300 RCU untuk Anda, yang dapat Anda gunakan dengan sangat cepat. Karena 300 RCU jauh lebih banyak daripada yang Anda butuhkan untuk pemindaian Anda (55), pemindaian Anda terjadi dengan sangat cepat, tanpa hambatan.
Saat Anda melakukan kueri, penghitungan RCU berlaku untuk jumlah data yang dibaca tanpa mempertimbangkan jumlah item yang dibaca. Jadi, jika item Anda kecil, katakanlah masing-masing beberapa byte, item tersebut dapat dengan mudah dikueri di dalam satu RCU 4KB.
Ini sangat berguna saat membaca banyak item dari DynamoDB juga. Tidak segera jelas bahwa menanyakan banyak item kecil jauh lebih murah dan lebih efisien daripada BatchGetting.