Pilih preferensi cookie Anda

Kami menggunakan cookie penting serta alat serupa yang diperlukan untuk menyediakan situs dan layanan. Kami menggunakan cookie performa untuk mengumpulkan statistik anonim sehingga kami dapat memahami cara pelanggan menggunakan situs dan melakukan perbaikan. Cookie penting tidak dapat dinonaktifkan, tetapi Anda dapat mengklik “Kustom” atau “Tolak” untuk menolak cookie performa.

Jika Anda setuju, AWS dan pihak ketiga yang disetujui juga akan menggunakan cookie untuk menyediakan fitur situs yang berguna, mengingat preferensi Anda, dan menampilkan konten yang relevan, termasuk iklan yang relevan. Untuk menerima atau menolak semua cookie yang tidak penting, klik “Terima” atau “Tolak”. Untuk membuat pilihan yang lebih detail, klik “Kustomisasi”.

Model konsistensi DAX dan DynamoDB

Mode fokus
Model konsistensi DAX dan DynamoDB - Amazon DynamoDB

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Amazon DynamoDB Accelerator (DAX) adalah layanan caching write-through yang dirancang untuk memudahkan proses menambahkan cache ke tabel DynamoDB. Karena DAX beroperasi secara terpisah dari DynamoDB, Anda harus memahami model konsistensi DAX dan DynamoDB untuk memastikan bahwa aplikasi Anda berfungsi seperti yang diharapkan.

Dalam banyak kasus penggunaan, cara aplikasi Anda menggunakan DAX memengaruhi konsistensi data dalam klaster DAX serta konsistensi data antara DAX dan DynamoDB.

Konsistensi di antara simpul klaster DAX

Guna mencapai ketersediaan tinggi untuk aplikasi Anda, sebaiknya sediakan setidaknya tiga simpul untuk klaster DAX Anda. Kemudian tempatkan simpul tersebut di beberapa Zona Ketersediaan dalam Wilayah.

Ketika klaster DAX Anda berjalan, klaster mereplikasi data di antara semua simpul dalam klaster (dengan asumsi bahwa Anda menyediakan lebih dari satu simpul). Pertimbangkan aplikasi yang berhasil melakukan UpdateItem menggunakan DAX. Tindakan ini menyebabkan cache item di simpul primer dimodifikasi dengan nilai baru. Nilai tersebut kemudian direplikasi ke semua simpul lain dalam klaster. Replikasi ini akhirnya konsisten dan biasanya membutuhkan waktu kurang dari satu detik untuk diselesaikan.

Dalam skenario ini, dua klien dapat membaca kunci yang sama dari klaster DAX yang sama tetapi menerima nilai yang berbeda, tergantung simpul yang diakses setiap klien. Semua simpul akan konsisten ketika pembaruan telah sepenuhnya direplikasi di seluruh simpul dalam klaster. (Perilaku ini mirip dengan sifat akhir konsisten DynamoDB.)

Jika Anda sedang membuat aplikasi yang menggunakan DAX, aplikasi tersebut harus dirancang agar dapat menoleransi data akhir konsisten.

Perilaku cache item DAX

Setiap klaster DAX memiliki dua cache yang berbeda, yaitu cache item dan cache kueri. Untuk informasi selengkapnya, lihat DAX: Cara kerjanya.

Bagian ini membahas implikasi konsistensi dari pembacaan dari dan penulisan ke cache item DAX.

Konsistensi pembacaan

Dengan DynamoDB, operasi GetItem melakukan bacaan akhir konsisten secara default. Anggaplah Anda menggunakan UpdateItem dengan klien DynamoDB. Jika kemudian Anda mencoba membaca item yang sama segera setelahnya, Anda mungkin melihat data yang muncul sebelum pembaruan. Hal ini disebabkan penundaan penyebaran di semua lokasi penyimpanan DynamoDB. Konsistensi biasanya tercapai dalam hitungan detik. Jadi jika mencoba kembali pembacaan, Anda mungkin akan melihat item yang diperbarui.

Saat Anda menggunakan GetItem dengan klien DAX, operasi (dalam kasus ini, bacaan akhir konsisten) berlanjut seperti yang ditunjukkan berikut ini.

Diagram alur kerja menunjukkan langkah-langkah bernomor untuk memperbarui item.
  1. Klien DAX mengeluarkan permintaan GetItem. DAX mencoba membaca item yang diminta dari cache item. Jika item ada dalam cache (cache hit), DAX mengembalikannya ke aplikasi.

  2. Jika item tidak tersedia (cache miss), DAX melakukan operasi GetItem akhir konsisten terhadap DynamoDB.

  3. DynamoDB mengembalikan item yang diminta dan DAX menyimpannya dalam cache item.

  4. DAX mengembalikan item ke aplikasi.

  5. (Tidak ditampilkan) Jika klaster DAX berisi lebih dari satu simpul, item direplikasi ke semua simpul lain dalam klaster.

Item tetap dalam cache item DAX, tunduk pada pengaturan Time to Live (TTL) dan algoritma paling lama tidak digunakan (LRU) untuk cache. Untuk informasi selengkapnya, lihat DAX: Cara kerjanya.

Namun, selama periode ini, DAX tidak membaca ulang item dari DynamoDB. Jika orang lain memperbarui item menggunakan klien DynamoDB dan sepenuhnya melewati DAX, permintaan GetItem menggunakan klien DAX memberikan hasil yang berbeda dari permintaan GetItem menggunakan klien DynamoDB. Dalam skenario ini, DAX dan DynamoDB memegang nilai yang tidak konsisten untuk kunci yang sama hingga TTL untuk item DAX kedaluwarsa.

Jika aplikasi memodifikasi data dalam tabel DynamoDB dasar dan melewati DAX, aplikasi perlu mengantisipasi dan menoleransi inkonsistensi data yang mungkin terjadi.

catatan

Selain GetItem, klien DAX juga mendukung permintaan BatchGetItem. BatchGetItem pada dasarnya adalah pembungkus satu atau beberapa permintaan GetItem, sehingga DAX memperlakukan masing-masing sebagai operasi GetItem individu.

Konsistensi penulisan

DAX adalah cache write-through, yang memudahkan proses mempertahankan konsistensi cache item DAX dengan tabel DynamoDB dasar.

Klien DAX mendukung operasi API penulisan yang sama seperti DynamoDB (PutItem, UpdateItem, DeleteItem, BatchWriteItem, dan TransactWriteItems). Ketika Anda menggunakan operasi ini dengan klien DAX, item yang ada di DAX dan DynamoDB diubah. DAX memperbarui item dalam cache item, terlepas dari nilai TTL untuk item ini.

Misalnya, anggaplah Anda membuat permintaan GetItem dari klien DAX untuk membaca item dari tabel ProductCatalog. (Kunci partisinya adalah Id dan tidak ada kunci urutan.) Anda mengambil item dengan Id 101. Nilai QuantityOnHand untuk item itu adalah 42. DAX menyimpan item dalam cache item dengan TTL tertentu. Untuk contoh ini, TTL diasumsikan 10 menit. Lalu, 3 menit kemudian, aplikasi lain menggunakan klien DAX untuk memperbarui item yang sama sehingga nilai QuantityOnHand sekarang adalah 41. Dengan asumsi bahwa item tidak diperbarui lagi, pembacaan berikutnya untuk item yang sama dalam 10 menit ke depan akan menampilkan nilai cache untuk QuantityOnHand (41).

Cara DAX memproses penulisan

DAX ditujukan untuk aplikasi yang memerlukan pembacaan performa tinggi. Sebagai cache write-through, DAX meneruskan penulisan Anda ke DynamoDB secara bersamaan, kemudian mereplikasi pembaruan yang dihasilkan untuk cache item Anda di semua simpul dalam klaster secara otomatis dan asinkron. Anda tidak perlu mengelola logika pembatalan cache karena DAX menanganinya untuk Anda.

DAX mendukung operasi penulisan berikut: PutItem, UpdateItem, DeleteItem, BatchWriteItem, dan TransactWriteItems.

Ketika Anda mengirim permintaan PutItem, UpdateItem, DeleteItem, atau BatchWriteItem ke DAX, hal berikut akan terjadi:

  • DAX mengirimkan permintaan ke DynamoDB.

  • DynamoDB membalas DAX, mengonfirmasi bahwa penulisan berhasil.

  • DAX menulis item ke cache item.

  • DAX menampilkan status berhasil ke pemohon.

Ketika Anda mengirim permintaan TransactWriteItems ke DAX, hal berikut akan terjadi:

  • DAX mengirimkan permintaan ke DynamoDB.

  • DynamoDB membalas DAX, mengonfirmasi bahwa transaksi selesai.

  • DAX menampilkan status berhasil ke pemohon.

  • Di latar belakang, DAX membuat permintaan TransactGetItems untuk setiap item dalam permintaan TransactWriteItems guna menyimpan item dalam cache item. TransactGetItems digunakan untuk memastikan isolasi yang dapat diserialisasi.

Jika penulisan ke DynamoDB gagal dengan alasan apa pun, termasuk throttling, item tidak di-cache di DAX. Pengecualian untuk kegagalan ditampilkan ke pemohon. Hal ini memastikan bahwa data tidak ditulis ke cache DAX kecuali sudah berhasil ditulis ke DynamoDB.

catatan

Setiap penulisan ke DAX akan mengubah status cache item. Namun, menulis ke cache item tidak memengaruhi cache kueri. (Cache item dan cache kueri DAX digunakan untuk tujuan yang berbeda dan beroperasi secara terpisah dari satu sama lain).

Perilaku cache kueri DAX

DAX melakukan cache untuk hasil dari permintaan Query dan Scan dalam cache kueri. Namun, hasil tersebut tidak memengaruhi cache item sama sekali. Saat aplikasi Anda mengajukan permintaan Query atau Scan dengan DAX, set hasil disimpan di cache kueri, bukan di cache item. Anda tidak dapat melakukan "pemanasan" cache item dengan melakukan operasi Scan karena cache item dan cache kueri adalah entitas terpisah.

Konsistensi query-update-query

Pembaruan untuk cache item atau tabel DynamoDB dasar tidak membatalkan atau mengubah hasil yang disimpan dalam cache kueri.

Sebagai gambaran, pertimbangkan skenario berikut. Aplikasi bekerja dengan tabel DocumentRevisions, yang memiliki DocId sebagai kunci partisi dan RevisionNumber sebagai kunci urutan.

  1. Klien mengeluarkan Query untuk DocId 101, untuk semua item dengan RevisionNumber lebih dari atau sama dengan 5. DAX menyimpan set hasil dalam cache kueri dan mengembalikan set hasil untuk pengguna.

  2. Klien mengeluarkan permintaan PutItem untuk DocId 101 dengan nilai RevisionNumber 20.

  3. Klien mengeluarkan Query yang sama seperti yang dijelaskan pada langkah 1 (DocId 101 dan RevisionNumber >= 5).

Dalam skenario ini, set hasil yang di-cache untuk Query yang dikeluarkan di langkah 3 identik dengan set hasil yang di-cache di langkah 1. Alasannya adalah karena DAX tidak membatalkan set hasil Query atau Scan berdasarkan pembaruan untuk masing-masing item. Operasi PutItem dari langkah 2 hanya tercermin dalam cache kueri DAX ketika TTL untuk Query kedaluwarsa.

Aplikasi Anda harus mempertimbangkan nilai TTL untuk cache kueri dan berapa lama aplikasi Anda dapat menoleransi hasil yang tidak konsisten antara cache kueri dan cache item.

Bacaan sangat konsisten dan transaksional

Untuk melakukan permintaan GetItem, BatchGetItem, Query, atau Scan yang sangat konsisten, Anda perlu mengatur parameter ConsistentRead ke benar. DAX meneruskan permintaan bacaan sangat konsisten ke DynamoDB. Ketika menerima respons dari DynamoDB, DAX mengembalikan hasil ke klien, tetapi tidak melakukan cache hasil. DAX tidak dapat menyediakan bacaan sangat konsisten sendiri karena tidak digabungkan dengan erat ke DynamoDB. Untuk alasan ini, setiap pembacaan berikutnya dari DAX harus merupakan bacaan akhir konsisten. Setiap bacaan sangat konsisten berikutnya juga harus diteruskan ke DynamoDB.

DAX menangani permintaan TransactGetItems dengan cara yang sama seperti bacaan sangat konsisten. DAX meneruskan semua permintaan TransactGetItems ke DynamoDB. Ketika menerima respons dari DynamoDB, DAX mengembalikan hasil ke klien, tetapi tidak melakukan cache hasil.

Caching negatif

DAX mendukung entri cache negatif baik di cache item dan di cache kueri. Entri cache negatif terjadi ketika DAX tidak dapat menemukan item yang diminta dalam tabel DynamoDB dasar. DAX melakukan cache hasil kosong dan mengembalikan hasil ke pengguna, bukan menghasilkan pesan kesalahan.

Misalnya, anggaplah aplikasi mengirimkan permintaan GetItem ke klaster DAX dan tidak ada item yang cocok dalam cache item DAX. Hal ini menyebabkan DAX membaca item yang sesuai dari tabel DynamoDB dasar. Jika item tidak ada di DynamoDB, DAX menyimpan item kosong dalam cache item dan mengembalikan item kosong ke aplikasi. Sekarang, anggaplah bahwa aplikasi mengirimkan permintaan GetItem lain untuk item yang sama. DAX menemukan item kosong dalam cache item dan langsung mengembalikannya ke aplikasi. DAX tidak melihat DynamoDB sama sekali.

Entri cache negatif tetap ada di cache item DAX hingga TTL item kedaluwarsa, LRU diinvokasi, atau item diubah menggunakan PutItem, UpdateItem, atau DeleteItem.

Cache kueri DAX menangani hasil cache negatif dengan cara yang sama. Jika aplikasi melakukan Query atau Scan dan cache kueri DAX tidak berisi hasil cache, DAX mengirimkan permintaan ke DynamoDB. Jika tidak ada item yang cocok dalam set hasil, DAX menyimpan set hasil kosong di cache kueri dan mengembalikan set hasil kosong ke aplikasi. Permintaan Query atau Scan berikutnya menghasilkan set hasil (kosong) yang sama, hingga TTL untuk hasil tersebut kedaluwarsa.

Strategi untuk penulisan

Perilaku write-through DAX sesuai untuk banyak pola aplikasi. Namun, ada beberapa pola aplikasi yang mungkin tidak cocok dengan model write-through.

Untuk aplikasi yang sensitif terhadap latensi, menulis melalui DAX menimbulkan lompatan jaringan tambahan. Jadi menulis ke DAX akan sedikit lebih lambat dibandingkan menulis langsung ke DynamoDB. Jika aplikasi Anda sensitif terhadap latensi tulis, Anda dapat mengurangi latensi dengan menulis langsung ke DynamoDB. Untuk informasi selengkapnya, lihat Write-around.

Untuk aplikasi dengan operasi tulis intensif (seperti yang melakukan pemuatan data massal), Anda mungkin tidak ingin menulis semua data melalui DAX karena hanya sebagian kecil dari data yang akan dibaca oleh aplikasi. Ketika Anda menulis sejumlah besar data melalui DAX, DAX harus menginvokasi algoritma LRU agar menyediakan ruang di cache untuk item baru yang akan dibaca. Hal ini mengurangi efektivitas DAX sebagai cache baca.

Ketika Anda menulis item ke DAX, status cache item diubah untuk mengakomodasi item baru. (Misalnya, DAX mungkin perlu menghapus data lama dari cache item untuk menyediakan ruang bagi item baru.) Item baru tetap dalam cache item, tunduk pada algoritma LRU cache dan pengaturan TTL untuk cache. Selama item tetap ada dalam cache item, DAX tidak membaca ulang item dari DynamoDB.

Write-through

Cache item DAX menerapkan kebijakan write-through. Untuk informasi selengkapnya, lihat Cara DAX memproses penulisan.

Ketika Anda menulis item, DAX memastikan bahwa item cache disinkronkan dengan item yang ada di DynamoDB. Hal ini sangat membantu untuk aplikasi yang perlu membaca ulang item segera setelah menulisnya. Namun, jika aplikasi lain menulis langsung ke tabel DynamoDB, item dalam cache item DAX tidak lagi sinkron dengan DynamoDB.

Sebagai gambaran, pertimbangkan dua pengguna (Alice dan Bob), yang bekerja dengan tabel ProductCatalog. Alice mengakses tabel menggunakan DAX, tetapi Bob melewati DAX dan mengakses tabel secara langsung di DynamoDB.

Diagram alur kerja menunjukkan langkah-langkah bernomor untuk memberi tahu cara pengguna Alice dan Bob mengakses tabel menggunakan DAX dan DynamoDB.
  1. Alice memperbarui item di tabel ProductCatalog. DAX meneruskan permintaan ke DynamoDB dan pembaruan berhasil. Kemudian, DAX menulis item ke cache item dan mengembalikan respons berhasil ke Alice. Sejak saat itu sampai item tersebut akhirnya dihapus dari cache, setiap pengguna yang membaca item dari DAX akan melihat item dengan pembaruan Alice.

  2. Beberapa waktu kemudian, Bob memperbarui item ProductCatalog yang sama seperti yang ditulis Alice. Namun, Bob memperbarui item secara langsung di DynamoDB. DAX tidak secara otomatis memperbarui item cache sebagai respons pembaruan melalui DynamoDB. Oleh karena itu, pengguna DAX tidak melihat pembaruan Bob.

  3. Alice membaca item dari DAX lagi. Item ada di cache item, jadi DAX mengembalikannya ke Alice tanpa mengakses tabel DynamoDB.

Dalam skenario ini, Alice dan Bob melihat representasi yang berbeda dari item ProductCatalog yang sama. Hal ini terjadi hingga DAX mengeluarkan item dari cache item, atau hingga pengguna lain memperbarui item yang sama lagi menggunakan DAX.

Write-around

Jika aplikasi Anda perlu menulis data dalam jumlah besar (seperti beban data massal), mungkin wajar untuk melewati DAX dan menulis data langsung ke DynamoDB. Strategi seperti write-around mengurangi latensi penulisan. Namun, cache item tidak akan sinkron dengan data di DynamoDB.

Jika Anda memutuskan untuk menggunakan strategi write-around, ingat bahwa DAX mengisi cache item setiap kali aplikasi menggunakan klien DAX untuk membaca data. Hal ini dapat menguntungkan dalam beberapa kasus karena memastikan bahwa hanya data yang paling sering dibaca yang di-cache (kebalikan dari data yang paling sering ditulis).

Sebagai contoh, pertimbangkan pengguna (Charlie) yang ingin bekerja dengan tabel yang berbeda, tabel GameScores, menggunakan DAX. Kunci partisi untuk GameScores adalah UserId, sehingga semua skor Charlie akan memiliki UserId yang sama.

Diagram alur kerja menunjukkan langkah-langkah bernomor untuk memberi tahu cara Charlie bekerja dengan tabel DynamoDB menggunakan DAX.
  1. Charlie ingin mengambil semua skornya, jadi dia mengirimkan Query ke DAX. Dengan asumsi bahwa permintaan ini belum dikeluarkan sebelumnya, DAX meneruskan kueri ke DynamoDB untuk diproses. Hasil akan disimpan dalam cache kueri DAX, dan kemudian dikembalikan ke Charlie. Set hasil tetap tersedia dalam cache kueri hingga dihapus.

  2. Sekarang anggaplah bahwa Charlie memainkan game Meteor Blasters dan mencapai skor tinggi. Charlie mengirim permintaan UpdateItem ke DynamoDB, memodifikasi item dalam tabel GameScores.

  3. Terakhir, Charlie memutuskan untuk menjalankan kembali Query sebelumnya untuk mengambil semua data dari GameScores. Charlie tidak melihat skor tinggi untuk Meteor Blasters dalam hasil. Hal ini karena hasil kueri berasal dari cache kueri, bukan cache item. Kedua cache terpisah dari satu sama lain, sehingga perubahan dalam satu cache tidak memengaruhi cache lainnya.

DAX tidak memperbarui set hasil dalam cache kueri dengan data terbaru dari DynamoDB. Setiap set hasil dalam cache kueri adalah hasil terbaru saat operasi Query atau Scan dilakukan. Jadi, hasil Query Charlie tidak mencerminkan operasi PutItem. Hal ini terjadi hingga DAX menghapus set hasil dari cache kueri.

PrivasiSyarat situsPreferensi cookie
© 2025, Amazon Web Services, Inc. atau afiliasinya. Semua hak dilindungi undang-undang.