Cache yang terintegrasi Azure Cosmos DB - Ringkasan

BERLAKU UNTUK: NoSQL

Cache terintegrasi Azure Cosmos DB adalah cache dalam memori yang membantu Anda memastikan biaya yang dapat dikelola dan latensi rendah selagi volume permintaan bertambah. Cache terintegrasi mudah diatur dan Anda tidak perlu menghabiskan waktu untuk menulis kode kustom untuk cache yang tidak valid atau mengelola infrastruktur backend. Cache terintegrasi menggunakan gateway khusus dalam akun Azure Cosmos DB Anda. Saat menyediakan gateway khusus, Anda dapat memilih jumlah simpul dan ukuran simpul berdasarkan jumlah inti dan memori yang diperlukan untuk beban kerja Anda. Setiap simpul gateway khusus memiliki cache terintegrasi terpisah dari yang lain.

Cache terintegrasi dikonfigurasi secara otomatis dalam gateway khusus. Cache terintegrasi memiliki dua bagian:

  • Cache item untuk titik baca
  • Cache kueri untuk kueri

Cache terintegrasi adalah cache read-through dan write-through dengan kebijakan pengeluaran Least Recently Used (LRU). Cache item dan cache kueri memiliki kapasitas yang sama dalam cache terintegrasi dan kebijakan pengeluaran LRU berlaku untuk keduanya. Data dikeluarkan dari cache secara ketat berdasarkan kapan data tersebut paling tidak baru digunakan, terlepas dari apakah itu titik baca atau kueri. Data yang di-cache dalam setiap node bergantung pada data terbaru yang ditulis atau dibaca melalui node tersebut. Jika item atau kueri ditembolok di satu node, belum tentu juga akan ditembolok di node lainnya.

Catatan

Apakah Anda memiliki umpan balik tentang cache terintegrasi? Kami ingin mendengar pendapat Anda! Jangan ragu untuk berbagi umpan balik secara langsung dengan tim teknik Azure Cosmos DB: cosmoscachefeedback@microsoft.com

Beban kerja yang mendapat manfaat dari cache terintegrasi

Tujuan utama dari cache terintegrasi adalah untuk mengurangi biaya untuk beban kerja yang berat dalam pembacaan. Latensi rendah, meskipun bermanfaat, bukanlah manfaat utama dari cache terintegrasi karena Azure Cosmos DB sudah cepat tanpa penembolokan.

Pembacaan titik dan kueri yang mengenai cache terintegrasi memiliki biaya RU 0. Hit cache memiliki biaya per operasi yang jauh lebih rendah daripada bacaan dari database backend.

Beban kerja yang sesuai dengan karakteristik berikut harus mengevaluasi apakah cache terintegrasi membantu menurunkan biaya:

  • Beban kerja baca-berat
  • Banyak titik baca berulang pada item besar
  • Banyak kueri RU tinggi berulang
  • Tombol pintasan partisi untuk pembacaan

Faktor terbesar dalam harapan penghematan adalah tingkat pengulangan pembacaan sendiri. Jika beban kerja Anda secara konsisten menjalankan titik baca atau kueri yang sama dalam waktu singkat, ini adalah kandidat yang bagus untuk cache terintegrasi. Saat menggunakan cache terintegrasi untuk pembacaan berulang, Anda hanya menggunakan RU untuk bacaan pertama. Bacaan berikutnya yang dirutekan melalui simpul gateway khusus yang sama (di dalam MaxIntegratedCacheStaleness jendela dan jika data belum dikeluarkan) tidak menggunakan throughput.

Beberapa beban kerja tidak boleh mempertimbangkan cache terintegrasi, termasuk:

  • Beban kerja tulis-berat
  • Titik baca atau kueri yang jarang terulang
  • Beban kerja membaca umpan perubahan

Cache item

Cache item digunakan untuk pembacaan titik (pencarian kunci/nilai berdasarkan ID Item dan kunci partisi).

Mengisi cache item

  • Penulisan, pembaruan, dan penghapusan baru secara otomatis diisi dalam cache item simpul yang dirutekan permintaannya
  • Item dari permintaan baca titik di mana item belum ada di cache (cache miss) dari simpul yang dirutekan permintaan ditambahkan ke cache item
  • Permintaan yang merupakan bagian dari batch transaksional atau dalam mode massal tidak mengisi cache item

Pengeluaran dan pelabelan tidak valid untuk cache item

Karena setiap simpul memiliki cache independen, kemungkinan item tidak valid atau dikeluarkan dalam cache satu simpul dan bukan yang lain. Item dalam cache simpul tertentu tidak valid dan dikeluarkan berdasarkan kriteria di bawah ini:

  • Pembaruan atau penghapusan item
  • Least recently used (LRU)
  • Waktu penyimpanan cache (dengan kata lain, MaxIntegratedCacheStaleness)

Cache kueri

Cache kueri digunakan untuk menyimpan kueri. Cache kueri mengubah kueri menjadi pencarian kunci/nilai di mana kunci adalah teks kueri dan nilainya adalah hasil kueri. Cache terintegrasi tidak memiliki mesin kueri, cache hanya menyimpan pencarian kunci/nilai untuk setiap kueri. Hasil kueri disimpan sebagai set, dan cache tidak melacak item individual. Item tertentu dapat disimpan dalam cache kueri beberapa kali jika muncul dalam kumpulan hasil beberapa kueri. Pembaruan pada item yang mendasar tidak tercermin dalam hasil kueri kecuali keusangan cache terintegrasi maksimum untuk kueri tercapai dan kueri dilayani dari database backend.

Mengisi cache kueri

  • Jika cache tidak memiliki hasil untuk kueri tersebut (cache miss) pada simpul yang dirutekan, kueri dikirim ke backend. Setelah kueri dijalankan, cache akan menyimpan hasil untuk kueri tersebut
  • Kueri dengan bentuk yang sama tetapi parameter atau opsi permintaan yang berbeda yang memengaruhi hasil (misalnya jumlah item maks) disimpan sebagai pasangan kunci/nilai mereka sendiri

Pengeluaran cache kueri

Pengeluaran cache kueri didasarkan pada simpul yang dirutekan permintaan. Kemungkinan kueri dapat dikeluarkan atau disegarkan pada satu simpul dan bukan yang lain.

  • Least recently used (LRU)
  • Waktu penyimpanan cache (dengan kata lain, MaxIntegratedCacheStaleness)

Bekerja dengan cache kueri

Anda tidak memerlukan kode khusus saat bekerja dengan cache kueri, bahkan jika kueri Anda memiliki beberapa halaman hasil. Praktik terbaik dan kode untuk penentuan halaman kueri tetap sama terlepas kueri Anda mengenai cache terintegrasi atau pun dieksekusi pada mesin kueri backend.

Cache kueri secara otomatis menyimpan token kelanjutan kueri jika berlaku. Jika Anda memiliki kueri dengan beberapa halaman hasil, halaman apa pun yang disimpan dalam cache terintegrasi memiliki biaya RU 0. Jika halaman hasil kueri berikutnya memerlukan eksekusi backend, halaman tersebut akan memiliki token kelanjutan dari halaman sebelumnya sehingga dapat menghindari duplikasi pekerjaan sebelumnya.

Penting

Instans cache terintegrasi dalam node gateway khusus yang berbeda memiliki cache independen satu sama lain. Jika data di-cache dalam satu node, data belum tentu di-cache di node lain. Beberapa halaman kueri yang sama tidak dijamin akan dirutekan ke node gateway khusus yang sama.

Konsistensi cache terintegrasi

Cache terintegrasi hanya mendukung permintaan baca dengan sesi dan konsistensi kejadian. Jika bacaan memiliki awalan yang konsisten, keusangan terikat, atau konsistensi yang kuat, bacaan melewati cache terintegrasi dan dilayani dari backend.

Cara termudah untuk mengonfigurasi sesi atau konsistensi akhir untuk semua pembacaan adalah dengan mengaturnya di tingkat akun. Namun, jika Anda hanya ingin beberapa bacaan Anda memiliki konsistensi tertentu, Anda juga dapat mengonfigurasi konsistensi pada tingkat permintaan.

Catatan

Menulis permintaan dengan konsistensi lain masih mengisi cache, tetapi untuk membaca dari cache, permintaan harus memiliki konsistensi sesi atau akhirnya.

Konsistensi sesi

Konsistensi sesi adalah tingkat konsistensi yang paling banyak digunakan untuk satu wilayah dan akun Azure Cosmos DB yang didistribusikan secara global. Dengan konsistensi sesi, sesi klien tunggal dapat membaca tulisan mereka sendiri. Setiap bacaan dengan konsistensi sesi yang tidak memiliki token sesi yang cocok akan dikenakan biaya RU. Ini termasuk permintaan pertama untuk item atau kueri tertentu saat aplikasi klien dimulai atau dimulai ulang, kecuali Anda secara eksplisit meneruskan token sesi yang valid. Klien di luar sesi yang melakukan penulisan akan melihat konsistensi akhir saat mereka menggunakan cache terintegrasi.

MaxIntegratedCacheStaleness

MaxIntegratedCacheStaleness adalah kebuntuan maksimum yang dapat diterima untuk pembacaan dan kueri titik di-cache, terlepas dari konsistensi yang dipilih. MaxIntegratedCacheStaleness dapat dikonfigurasi pada tingkat permintaan. Misalnya, jika Anda mengatur MaxIntegratedCacheStaleness dari 2 jam, permintaan Anda hanya akan mengembalikan data cache jika data tersebut berusia kurang dari 2 jam. Untuk meningkatkan kemungkinan pembacaan berulang menggunakan cache terintegrasi, Anda harus mengatur MaxIntegratedCacheStaleness ​​setinggi yang diizinkan oleh persyaratan bisnis Anda.

MaxIntegratedCacheStaleness, ketika dikonfigurasi pada permintaan yang akhirnya mengisi cache, tidak memengaruhi berapa lama permintaan tersebut di-cache. MaxIntegratedCacheStaleness memberlakukan konsistensi saat Anda mencoba membaca data cache. Tidak ada pengaturan retensi TTL atau cache global, sehingga data hanya dikeluarkan dari cache jika cache terintegrasi penuh atau bacaan baru dijalankan dengan lebih rendah MaxIntegratedCacheStaleness dari usia entri cache saat ini.

Ini adalah peningkatan dari cara kerja sebagian besar cache dan memungkinkan penyesuaian lainnya berikut:

  • Anda dapat mengatur persyaratan keusangan yang berbeda untuk setiap pembacaan poin atau kueri
  • Klien yang berbeda, meskipun menjalankan pembacaan titik atau kueri yang sama, dapat mengonfigurasi nilai MaxIntegratedCacheStaleness yang berbeda
  • Jika Anda ingin memodifikasi konsistensi baca untuk data yang di-cache, perubahan MaxIntegratedCacheStaleness memiliki efek langsung pada konsistensi baca

Catatan

Nilai minimum MaxIntegratedCacheStaleness adalah 0 dan nilai maksimumnya adalah 10 tahun. Saat tidak dikonfigurasi secara eksplisit, defaultnya MaxIntegratedCacheStaleness menjadi 5 menit.

Untuk lebih memahami parameter MaxIntegratedCacheStaleness, perhatikan contoh berikut:

Waktu Permintaan Respons
t = 0 detik Menjalankan Kueri A dengan MaxIntegratedCacheStaleness = 30 detik Mengembalikan hasil dari database backend (biaya RU normal) dan mengisi cache
t = 0 detik Menjalankan Kueri B dengan MaxIntegratedCacheStaleness = 60 detik Mengembalikan hasil dari database backend (biaya RU normal) dan mengisi cache
t = 20 detik Menjalankan Kueri A dengan MaxIntegratedCacheStaleness = 30 detik Mengembalikan hasil dari cache terintegrasi (biaya RU 0)
t = 20 detik Menjalankan Kueri B dengan MaxIntegratedCacheStaleness = 60 detik Mengembalikan hasil dari cache terintegrasi (biaya RU 0)
t = 40 detik Menjalankan Kueri A dengan MaxIntegratedCacheStaleness = 30 detik Mengembalikan hasil dari database backend (biaya RU normal) dan menyegarkan cache
t = 40 detik Menjalankan Kueri B dengan MaxIntegratedCacheStaleness = 60 detik Mengembalikan hasil dari cache terintegrasi (biaya RU 0)
t = 50 detik Menjalankan Kueri B dengan MaxIntegratedCacheStaleness = 20 detik Mengembalikan hasil dari database backend (biaya RU normal) dan menyegarkan cache

Pelajari cara mengonfigurasi MaxIntegratedCacheStaleness.

Melewati cache terintegrasi (Pratinjau)

Cache terintegrasi memiliki kapasitas penyimpanan terbatas yang ditentukan oleh SKU gateway khusus yang disediakan. Secara default, semua permintaan dari klien yang dikonfigurasi dengan gateway khusus string koneksi melalui cache terintegrasi dan mengambil ruang cache. Anda dapat mengontrol item dan kueri mana yang di-cache dengan opsi permintaan cache terintegrasi bypass, yang saat ini dalam pratinjau. Opsi permintaan ini berguna untuk penulisan item atau permintaan baca yang tidak diharapkan sering diulang. Melewati cache terintegrasi untuk item dengan akses jarang menghemat ruang cache untuk item dengan lebih banyak pengulangan, meningkatkan potensi penyimpanan RU dan mengurangi pengeluaran. Permintaan yang melewati cache masih dirutekan melalui gateway khusus. Permintaan ini dilayani dari backend dan RU biaya.

Pelajari cara melewati cache terintegrasi.

Metrik

Sangat membantu untuk memantau beberapa metrik utama untuk cache terintegrasi. Metrik ini meliputi:

  • DedicatedGatewayCPUUsage - Penggunaan CPU dengan jenis Agregasi Avg, Max, atau Min untuk data di seluruh node gateway khusus.
  • DedicatedGatewayAverageCPUUsage - (Tidak digunakan lagi) Penggunaan CPU rata-rata di seluruh node gateway khusus.
  • DedicatedGatewayMaximumCPUUsage - (Tidak digunakan lagi) Penggunaan CPU maksimum di seluruh node gateway khusus.
  • DedicatedGatewayMemoryUsage - Penggunaan memori dengan jenis Agregasi Avg, Max, atau Min untuk data di seluruh node gateway khusus.
  • DedicatedGatewayAverageMemoryUsage - (Tidak digunakan lagi) Penggunaan memori rata-rata di seluruh node gateway khusus.
  • DedicatedGatewayRequests - Jumlah total permintaan gateway khusus di semua node gateway khusus.
  • IntegratedCacheEvictedEntriesSize – Jumlah rata-rata data yang dibatalkan dari cache terintegrasi karena LRU di seluruh node gateway khusus. Nilai ini tidak menyertakan data yang kedaluwarsa karena melebihi MaxIntegratedCacheStaleness waktu.
  • IntegratedCacheItemExpirationCount - Jumlah item rata-rata yang dibatalkan dari cache terintegrasi karena pembacaan titik yang ditembolok melebihi waktu MaxIntegratedCacheStaleness di seluruh node gateway khusus.
  • IntegratedCacheQueryExpirationCount - Jumlah kueri rata-rata yang dibatalkan dari cache terintegrasi karena kueri cache melebihi waktu MaxIntegratedCacheStaleness di seluruh node gateway khusus.
  • IntegratedCacheItemHitRate – Proporsi pembacaan titik yang menggunakan cache terintegrasi (dari semua pembacaan titik yang dirutekan melalui gateway khusus dengan sesi atau konsistensi akhir). Nilai ini adalah rata-rata instans cache terintegrasi di semua node gateway khusus.
  • IntegratedCacheQueryHitRate – Proporsi kueri yang menggunakan cache terintegrasi (dari semua kueri yang dirutekan melalui gateway khusus dengan sesi atau konsistensi akhir). Nilai ini adalah rata-rata instans cache terintegrasi di semua node gateway khusus.

Semua metrik yang ada tersedia, secara default, dari Metrik di portal Azure (bukan Metrik klasik):

Screenshot of the Azure portal that shows the location of integrated cache metrics.

Metrik adalah rata-rata, maksimum, atau jumlah di semua node gateway khusus. Misalnya, jika Anda menyediakan kluster gateway khusus dengan lima node, metrik mencerminkan nilai agregat di kelima node. Tidak dimungkinkan untuk menentukan nilai metrik untuk setiap node secara individu.

Pemecahan masalah umum

Contoh di bawah ini menunjukkan cara melakukan debug pada beberapa skenario umum:

Saya tidak tahu apakah aplikasi saya menggunakan gateway khusus

Periksa DedicatedGatewayRequests. Metrik ini mencakup semua permintaan yang menggunakan gateway khusus, terlepas dari apakah metrik mencapai cache terintegrasi. Jika aplikasi Anda menggunakan gateway standar atau mode langsung dengan string koneksi asli, Anda tidak akan melihat pesan kesalahan, tetapi DedicatedGatewayRequests akan menjadi nol. Jika aplikasi Anda menggunakan mode langsung dengan gateway khusus string koneksi, Anda mungkin masih melihat beberapa DedicatedGatewayRequests.

Saya tidak tahu apakah permintaan saya mencapai hit cache terintegrasi

Periksa IntegratedCacheItemHitRate dan IntegratedCacheQueryHitRate. Jika kedua nilai ini nol, maka permintaan tidak mencapai cache terintegrasi. Periksa apakah Anda menggunakan gateway khusus string koneksi, menyambungkan dengan mode gateway, dan menggunakan sesi atau konsistensi akhir.

Saya ingin mengetahui apakah gateway khusus saya terlalu kecil

Periksa IntegratedCacheItemHitRate dan IntegratedCacheQueryHitRate. Nilai tinggi (misalnya, di atas 0,7-0,8) adalah pertanda baik bahwa gateway khusus cukup besar.

Jika IntegratedCacheItemHitRate atau IntegratedCacheQueryHitRate rendah, lihat IntegratedCacheEvictedEntriesSize. Jika IntegratedCacheEvictedEntriesSize tinggi, hal ini dapat berarti bahwa Anda dapat menggunakan ukuran gateway khusus yang lebih besar. Anda dapat bereksperimen dengan meningkatkan ukuran gateway khusus dan membandingkan IntegratedCacheItemHitRate dan IntegratedCacheQueryHitRate yang baru. Jika gateway khusus yang lebih besar tidak meningkatkan IntegratedCacheItemHitRate atau IntegratedCacheQueryHitRate, mungkin saja pembacaan tidak cukup berulang agar cache terintegrasi dapat berdampak.

Saya ingin mengetahui apakah gateway khusus saya terlalu besar

Lebih sulit untuk mengukur jika gateway khusus terlalu besar daripada mengukur jika gateway khusus terlalu kecil. Secara umum, Anda harus memulai dari yang kecil dan perlahan-lahan meningkatkan ukuran gateway khusus hingga IntegratedCacheItemHitRate dan IntegratedCacheQueryHitRate berhenti meningkat. Dalam beberapa kasus, hanya satu dari dua metrik hit cache yang penting, bukan keduanya. Misalnya, jika beban kerja Anda utamanya adalah kueri, daripada pembacaan titik, IntegratedCacheQueryHitRate jauh lebih penting daripada IntegratedCacheItemHitRate.

Jika sebagian besar data dikeluarkan dari cache karena melebihi MaxIntegratedCacheStaleness dan bukan LRU, cache Anda mungkin lebih besar dari yang diperlukan. Jika gabungan IntegratedCacheItemExpirationCount dan IntegratedCacheQueryExpirationCount hampir sebesar IntegratedCacheEvictedEntriesSize, Anda dapat bereksperimen dengan ukuran gateway khusus yang lebih kecil dan membandingkan performa.

Saya ingin memahami apakah saya perlu menambahkan lebih banyak node gateway khusus

Dalam beberapa kasus, jika latensi tiba-tiba tinggi, Anda mungkin memerlukan lebih banyak node gateway khusus daripada node yang lebih besar. Periksa DedicatedGatewayCPUUsage dan DedicatedGatewayMemoryUsage untuk menentukan apakah menambahkan lebih banyak node gateway khusus akan mengurangi latensi. Sebaiknya diingat bahwa karena semua instans cache terintegrasi saling independen satu sama lain, menambahkan lebih banyak node gateway khusus tidak akan mengurangi IntegratedCacheEvictedEntriesSize. Menambahkan lebih banyak node akan meningkatkan volume permintaan yang dapat ditangani oleh kluster gateway khusus Anda.

Langkah berikutnya