Praktik Terbaik untuk menggunakan Read Replicas - Amazon ElastiCache

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

Praktik Terbaik untuk menggunakan Read Replicas

Banyak aplikasi, seperti toko sesi, papan peringkat, dan mesin rekomendasi, memerlukan ketersediaan tinggi dan menangani operasi baca secara signifikan lebih banyak daripada operasi tulis. Aplikasi ini sering dapat mentolerir data yang sedikit basi (konsistensi akhirnya), yang berarti bahwa itu dapat diterima jika pengguna yang berbeda sejenak melihat versi yang sedikit berbeda dari data yang sama. Misalnya:

  • Hasil kueri yang di-cache seringkali dapat mentolerir data yang sedikit basi, terutama untuk pola selain cache di mana sumber kebenarannya adalah eksternal.

  • Dalam papan peringkat game, penundaan beberapa detik dalam skor yang diperbarui seringkali tidak akan berdampak signifikan pada pengalaman pengguna.

  • Untuk penyimpanan sesi, beberapa penundaan kecil dalam menyebarkan data sesi di seluruh replika jarang memengaruhi fungsionalitas aplikasi.

  • Mesin rekomendasi biasanya menggunakan analisis data historis, sehingga konsistensi waktu nyata kurang penting.

Konsistensi akhirnya berarti bahwa semua node replika pada akhirnya akan mengembalikan data yang sama setelah proses replikasi selesai, biasanya dalam milidetik. Untuk kasus penggunaan seperti itu, menerapkan replika baca adalah strategi yang efektif untuk mengurangi latensi saat membaca dari instans Anda ElastiCache.

Menggunakan replika baca di Amazon ElastiCache dapat memberikan manfaat kinerja yang signifikan melalui:

Peningkatan Skalabilitas Baca

  • Mendistribusikan operasi baca di beberapa node replika

  • Offload membaca lalu lintas dari simpul utama

  • Mengurangi latensi baca dengan menyajikan permintaan dari replika yang lebih dekat secara geografis

Kinerja Node Primer yang Dioptimalkan

  • Mendedikasikan sumber daya node utama untuk menulis operasi

  • Mengurangi overhead koneksi pada node utama

  • Meningkatkan kinerja penulisan dan mempertahankan waktu respons yang lebih baik selama periode lalu lintas puncak

Menggunakan Baca dari Replika di Tanpa Server ElastiCache

ElastiCache tanpa server menyediakan dua titik akhir yang berbeda, untuk persyaratan konsistensi yang berbeda. Kedua titik akhir menggunakan nama DNS yang sama tetapi port yang berbeda. Untuk menggunakan read-from-replica port, Anda harus mengotorisasi akses ke kedua port dari aplikasi klien Anda dengan mengonfigurasi grup keamanan dan daftar kontrol akses jaringan VPC Anda.

Titik akhir primer (Port 6379)

  • Gunakan untuk operasi yang membutuhkan konsistensi segera

  • Jaminan membaca up-to-date data terbanyak

  • Terbaik untuk transaksi kritis dan operasi tulis

  • Diperlukan untuk operasi menulis

  • Contoh: test-12345.serverless.use1.cache.amazonaws.com:6379

Titik akhir yang dioptimalkan latensi (Port 6380)

  • Dioptimalkan untuk operasi baca yang dapat mentolerir konsistensi akhirnya

  • Jika memungkinkan, ElastiCache tanpa server secara otomatis merutekan permintaan baca ke node replika di Availability Zone lokal klien. Optimalisasi ini memberikan latensi yang lebih rendah dengan menghindari latensi jaringan tambahan yang terjadi saat mengambil data dari node di zona ketersediaan yang berbeda.

  • ElastiCache tanpa server secara otomatis memilih node yang tersedia di zona lain jika node lokal tidak tersedia

  • Contoh: test-12345.serverless.use1.cache.amazonaws.com:6380

  • Klien seperti Glide dan Lettuce akan secara otomatis mendeteksi dan merutekan pembacaan ke titik akhir yang dioptimalkan latensi jika Anda memberikan konfigurasi replika baca dari. Jika klien Anda tidak mendukung konfigurasi routing (misalnya, valkey-java dan versi jedis yang lebih lama), Anda harus menentukan port dan konfigurasi klien yang tepat untuk membaca dari replika.

Menghubungkan untuk membaca replika di ElastiCache Tanpa Server - Valkey dan Glide

Cuplikan kode berikut menunjukkan bagaimana Anda dapat mengonfigurasi baca dari replika untuk ElastiCache Tanpa Server di pustaka glide Valkey. Anda tidak perlu menentukan port untuk dibaca dari replika, tetapi Anda perlu mengonfigurasi konfigurasi perutean. ReadFrom.PREFER_REPLICA

package glide.examples; import glide.api.GlideClusterClient; import glide.api.logging.Logger; import glide.api.models.configuration.GlideClusterClientConfiguration; import glide.api.models.configuration.NodeAddress; import glide.api.models.exceptions.ClosingException; import glide.api.models.exceptions.ConnectionException; import glide.api.models.exceptions.TimeoutException; import glide.api.models.configuration.ReadFrom; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; public class ClusterExample { public static void main(String[] args) { // Set logger configuration Logger.setLoggerConfig(Logger.Level.INFO); GlideClusterClient client = null; try { System.out.println("Connecting to Valkey Glide..."); // Configure the Glide Client GlideClusterClientConfiguration config = GlideClusterClientConfiguration.builder() .address(NodeAddress.builder() .host("your-endpoint") .port(6379) .build()) .useTLS(true) .readFrom(ReadFrom.PREFER_REPLICA) .build(); // Create the GlideClusterClient client = GlideClusterClient.createClient(config).get(); System.out.println("Connected successfully."); // Perform SET operation CompletableFuture<String> setResponse = client.set("key", "value"); System.out.println("Set key 'key' to 'value': " + setResponse.get()); // Perform GET operation CompletableFuture<String> getResponse = client.get("key"); System.out.println("Get response for 'key': " + getResponse.get()); // Perform PING operation CompletableFuture<String> pingResponse = client.ping(); System.out.println("PING response: " + pingResponse.get()); } catch (ClosingException | ConnectionException | TimeoutException | ExecutionException e) { System.err.println("An exception occurred: "); e.printStackTrace(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { // Close the client connection if (client != null) { try { client.close(); System.out.println("Client connection closed."); } catch (ClosingException | ExecutionException e) { System.err.println("Error closing client: " + e.getMessage()); } } } } }