Menengah7 menit baca

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.

sinkronisasi, diakuiasync, tertinggal sebentarmungkin mengenai node yangtertinggalTulis:email baruNode utamaReplika 1Replika 2Bacaan yang sangat konsistenAkhirnya konsisten membaca

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 melawanSangat konsisten?
Meja dasarYa — 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. TransactGetItems selalu 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:

Mode4 blok KBRCU dikonsumsiKapan harus digunakan
Sangat konsisten2 (dibulatkan 6 KB)2 RCULayar konfirmasi setelah Anda menulis sendiri
Akhirnya konsisten21 RCUDasbor, 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:

  1. UpdateItem dengan email baru.
  2. Segera GetItem dengan ConsistentRead: true di 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.

Diperbarui