DynamoDB Pembacaan Sangat vs Akhirnya Konsisten
Anda memperbarui item, segera membacanya kembali, dan mendapatkan nilai lama. Tulisan itu berhasil — sesaat kemudian pembacaan yang sama mengembalikan nilai baru. Tidak ada yang rusak: Anda telah mencapai pembacaan default akhirnya konsisten DynamoDB, dan Anda dapat memilih untuk tidak ikut serta itu per permintaan.
Ini adalah salah satu dari sedikit kenop kebenaran yang diberikan langsung oleh DynamoDB kepada Anda, dan memiliki a harga sebenarnya terlampir. Melakukannya dengan benar berarti mengetahui apa yang dijamin oleh setiap mode, apa saja biayanya mahal, dan jika pembacaan yang kuat tidak tersedia.
Apa perbedaan antara pembacaan yang kuat dan akhirnya konsisten di DynamoDB?
Pembacaan yang pada akhirnya konsisten (default) dilayani oleh replika apa pun, sehingga replika tersebut dapat mengembalikan data lama segera setelah penulisan, namun biayanya setengahnya. Pembacaan yang sangat konsisten, diikutsertakan per permintaan dengan ConsistentRead=true, dirutekan ke pemimpin partisi dan selalu mencerminkan setiap penulisan yang dilakukan — dengan kapasitas baca 2×.
- Akhirnya konsisten (default) — mungkin akan segera mengembalikan data lama setelahnya sebuah tulisan. Mode baca termurah.
- Sangat konsisten — selalu mencerminkan setiap penulisan yang dilakukan sebelum pembacaan.
Ikut serta per permintaan dengan
ConsistentRead=true. - Pembacaan yang kuat memerlukan biaya 2× pada akhirnya. Pembacaan yang sangat konsisten menghabiskan waktu dua kali lipat kapasitas baca yang pada akhirnya konsisten untuk data yang sama.
- Tidak di semua tempat. Anda mendapatkan bacaan yang kuat di tabel dasar dan di Lokal Indeks Sekunder. Indeks Sekunder Global hanya bersifat final — tanpa ikut serta.
- Default ke akhirnya. Raihlah kekuatan hanya ketika membaca tulisan Anda sendiri yang baru saja data dan basi sesaat akan salah.
Masalahnya: pembacaan yang tidak melihat tulisan terbaru
Katakanlah Anda menjalankan akun pengguna. Seorang pengguna mengubah email pemberitahuannya, tulis aplikasi Anda pembaruan, dan layar konfirmasi segera membaca ulang profil untuk menampilkan alamat baru. Dengan mode baca default, pembacaan ulang tersebut dapat mendarat di replika itu belum menerima perubahannya — sehingga pengguna melihat email lama mereka dan berasumsi penyimpanan gagal.
Jendelanya kecil (biasanya kurang dari satu detik) dan menutup dengan sendirinya. Tapi "biasanya benar" tidak cukup baik untuk konfirmasi baca-setelah-tulis. Itu persisnya ada konsistensi yang kuat.
Mengapa konsistensi akhirnya terjadi
DynamoDB menyimpan setiap partisi di tiga node penyimpanan — satu primer dan dua replika — di seluruh Availability Zone yang terpisah. Tulisan diakui setelah mendarat pada replika utama dan satu; itu kemudian menyebar ke node ketiga secara asinkron.
Pembacaan, untuk menyebarkan beban, dapat dilayani oleh mana saja dari tiga node. Sebuah akhirnya pembacaan yang konsisten mungkin mengenai simpul yang belum menerima penulisan terbaru Anda — begitulah mengembalikan nilai yang sedikit basi. Pembacaan sangat konsisten dialihkan ke pemimpin untuk partisi, yang selalu menyimpan data komitmen terbaru, jadi tidak pernah mengembalikan hasil basi.
Keterlambatan replikasi itulah yang menjadi perbedaan keseluruhannya. Ini juga menjelaskan 2× biaya: pembacaan yang kuat tidak dapat diseimbangkan bebannya di seluruh replika seperti halnya pembacaan pada akhirnya DynamoDB memberi harga dua kali lipat dari kapasitasnya.
Biayanya, dibuat beton
Pembacaan diukur dalam Unit Kapasitas Baca (RCU), masing-masing mencakup hingga 4 KB. Satu RCU
membeli satu pembacaan yang sangat konsisten atau dua pembacaan yang pada akhirnya konsisten sebesar 4 KB
barang. Jadi membalik ConsistentRead=true pada jalur baca panas akan melipatgandakan biaya bacanya — aktif
titik akhir dengan lalu lintas tinggi yang merupakan item baris yang akan Anda lihat.
Modelkan perbedaannya untuk ukuran item Anda sendiri dan tarif permintaan dengan Kalkulator harga DynamoDB sebelum Anda membuatnya strong membaca default Anda — jarang ada gunanya membayar dua kali secara keseluruhan.
Dimana bacaan yang kuat tersedia (dan tidak tersedia).
| Baca melawan | Sangat konsisten? |
|---|---|
| Meja dasar | Ya — ikut serta dengan ConsistentRead=true |
| Indeks Sekunder Lokal (LSI) | Ya — keikutsertaan yang sama seperti tabel dasar |
| Indeks Sekunder Global (GSI) | Tidak — hanya pada akhirnya, tidak ada penggantian |
GSI menyimpan salinan datanya sendiri, yang direplikasi dari tabel dasar secara asinkron, sehingga tidak pernah menawarkan pembacaan yang kuat. Jika pola akses benar-benar perlu baca-setelah-tulis dan Anda berencana untuk menyajikannya dari GSI, itu sebuah sinyal untuk menyajikannya dari meja dasar atau LSI sebagai gantinya.
Jebakan + langkah selanjutnya
- Jangan jadikan pembacaan yang kuat sebagai default. Sebagian besar pembacaan menoleransi waktu basi sub-detik jendela; membayar 2× di mana-mana adalah pembelanjaan yang sia-sia.
- Jangan berharap baca-setelah-tulis dari GSI. Ini pada akhirnya memang disengaja — lihat mengapa GSI pada akhirnya konsisten.
- Transaksi sangat terbaca.
TransactGetItemsselalu sangat konsisten — lihat transaksi DynamoDB. - Konsistensi berinteraksi dengan kapasitas. Pengganda 2× berhubungan langsung perencanaan biaya sesuai permintaan vs yang disediakan.
Ingin menjelajahi tabel dan indeks DynamoDB Anda tanpa menulis panggilan API? Unduh DynoTable dan periksa data Anda secara langsung.
Perbandingan RCU yang berhasil
Dua bacaan dari item 6 KB yang sama di tabel dasar:
| Mode | 4 blok KB | RCU dikonsumsi | Kapan harus digunakan |
|---|---|---|---|
| Sangat konsisten | 2 (dibulatkan 6 KB) | 2 RCU | Layar konfirmasi setelah Anda menulis sendiri |
| Akhirnya konsisten | 2 | 1 RCU | Dasbor, daftar, analitik |
Dengan 1.000 pembacaan per detik, mode kuat membutuhkan biaya sekitar dua kali lipat biaya sesuai permintaan
baca pembelanjaan mode akhirnya — modelkan delta di
kalkulator harga sebelum membaliknya
jalur ke ConsistentRead=true secara global.
Konsistensi BatchGetItem
Setiap entri tabel di BatchGetItem dapat mengatur ConsistentRead secara independen. SEBUAH
dasbor yang memuat profil pengguna (kuat) dan pengaturan terkait (akhirnya) bisa
mencampur flag dalam satu panggilan batch — masih tunduk pada pembacaan kuat per tabel
aturan ketersediaan (tidak kuat di GSI).
Baca-setelah-tulis dalam kode aplikasi
Pola konfirmasi pembaruan profil:
UpdateItemdengan email baru.- Segera
GetItemdenganConsistentRead: truedi tabel dasar.
Langkah 2 memerlukan biaya 2× RCU dari pembacaan akhir tetapi menjamin konfirmasi layar cocok dengan tulisan. Lewati bacaan yang kuat tentang agregasi latar belakang itu mentolerir jeda sub-detik.
Default DynoTable
Pembacaan eksplorasi di DynoTable pada akhirnya menggunakan kueri tabel dasar yang konsisten kecuali Anda memilih semantik yang lebih kuat di pengaturan lanjutan — paling cocok kasus penggunaan dasbor. Setelah melakukan penulisan, penyegaran editor item ditampilkan nilai-nilai komitmen dari respons yang berhasil tanpa konsistensi yang terpisah beralih untuk jalur umum.
Gunakan pembuat kueri untuk memancarkan pembacaan sampel dengan
ConsistentRead disetel secara eksplisit saat menyalin kode SDK ke layanan yang memerlukan
jaminan baca-setelah-tulis.
Catatan Tabel Global
Tabel Global direplikasi secara asinkron di seluruh Wilayah. Konsistensi yang kuat berlaku
dalam satu replika Wilayah, bukan secara global. Sebuah tulisan di us-east-1 tidak
mudah dibaca secara instan di eu-west-1 — rencanakan UX lintas Wilayah dengan tepat.
Lihat tabel global untuk mengetahui ekspektasi kelambatan replikasi.