Aplikasi yang menggunakan Tair (Redis OSS-compatible) dapat mengalami kesalahan sementara terkait jaringan dan lingkungan operasi, seperti jitter jaringan sesaat, ketidaktersediaan layanan sementara, atau timeout akibat beban tinggi. Anda dapat mengonfigurasi mekanisme pengulangan otomatis untuk menghindari kegagalan sementara dan memastikan operasi berhasil.
Penyebab kesalahan sementara
Penyebab | Deskripsi |
Mekanisme ketersediaan tinggi dipicu oleh kesalahan | Tair (Redis OSS-compatible) dapat memantau status kesehatan node. Jika Node master dalam suatu instance gagal, pergantian master-replika akan dipicu secara otomatis. Sebagai contoh, peran node master dan replika diubah untuk memastikan ketersediaan tinggi instance tersebut. Akibatnya, klien mungkin mengalami kesalahan sementara berikut:
Catatan Untuk informasi lebih lanjut, lihat Ketersediaan Tinggi. |
Pemblokiran permintaan akibat query lambat | Pemblokiran permintaan dan query lambat terjadi saat operasi dengan kompleksitas waktu O(N) dilakukan. Dalam kasus ini, permintaan lain yang diinisiasi oleh klien mungkin gagal sementara. |
Lingkungan jaringan yang kompleks | Lingkungan jaringan yang kompleks antara klien dan server dapat menyebabkan masalah seperti jitter jaringan sesekali dan retransmisi data. Dalam kasus ini, permintaan yang diinisiasi oleh klien mungkin gagal sementara. |
Aturan pengulangan yang direkomendasikan
Aturan Pengulangan | Deskripsi |
Coba ulang hanya operasi idempoten | Timeout dapat terjadi pada salah satu fase berikut:
Operasi yang diulang mungkin dieksekusi beberapa kali di server. Oleh karena itu, tidak semua operasi cocok untuk mekanisme pengulangan. Kami merekomendasikan agar Anda hanya mencoba ulang operasi idempoten, seperti menjalankan perintah SET. Jika Anda menjalankan perintah SET a b beberapa kali, nilai a hanya akan menjadi b. Namun, jika Anda menjalankan perintah LPUSH mylist a, yang bukan idempoten, mylist mungkin berisi elemen a yang banyak. |
Konfigurasikan jumlah pengulangan dan interval yang tepat | Konfigurasikan jumlah pengulangan dan interval berdasarkan kebutuhan bisnis dalam skenario nyata. Jika tidak, masalah berikut dapat terjadi:
Kebijakan interval pengulangan umum meliputi pengulangan segera, pengulangan interval tetap, pengulangan eksponensial mundur, dan pengulangan mundur acak. |
Hindari sarang pengulangan | Sarang pengulangan dapat menyebabkan pengulangan berulang bahkan tanpa batas. |
Catat pengecualian pengulangan dan hasilkan laporan kegagalan | Selama proses pengulangan, kami merekomendasikan agar Anda mengonfigurasi sistem untuk menghasilkan log pengulangan pada level WARN dan hanya ketika pengulangan gagal. |
Jedis
Kami merekomendasikan agar Anda menggunakan Jedis 4.0.0 atau yang lebih baru, lebih disukai versi Jedis terbaru. Dalam contoh berikut, Jedis 5.0.0 digunakan.
Tambahkan dependensi berikut ke file pom.xml Anda untuk menyertakan Jedis:
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>5.0.0</version> </dependency>Gunakan Jedis untuk mencoba ulang operasi.
Jika instance adalah instance standar atau instance kluster dalam mode proxy, Anda harus menggunakan mode JedisPool.
Kode sampel berikut secara otomatis mencoba ulang perintah SET hingga 5 kali dalam durasi total pengulangan 10 detik, dengan waktu tunggu yang meningkat secara eksponensial di antara setiap pengulangan. Jika semua pengulangan gagal, pengecualian dilemparkan.
PooledConnectionProvider provider = new PooledConnectionProvider(HostAndPort.from("127.0.0.1:6379")); int maxAttempts = 5; // Jumlah maksimum pengulangan. Duration maxTotalRetriesDuration = Duration.ofSeconds(10); // Durasi total maksimum pengulangan. UnifiedJedis jedis = new UnifiedJedis(provider, maxAttempts, maxTotalRetriesDuration); try { System.out.println("set key: " + jedis.set("key", "value")); } catch (Exception e) { // Jika pengecualian ditangkap di blok ini, itu berarti operasi gagal meskipun sudah mencapai jumlah percobaan maksimum (maxAttempts) atau durasi total pengulangan maksimum (maxTotalRetriesDuration). e.printStackTrace(); }Jika instance adalah instance kluster dalam mode koneksi langsung, Anda harus menggunakan mode JedisCluster.
Anda dapat mengonfigurasi parameter maxAttempts untuk menentukan jumlah percobaan pengulangan dalam kasus kegagalan, dengan nilai default 5. Jika operasi masih gagal setelah jumlah percobaan maksimum, pengecualian dilemparkan.
HostAndPort hostAndPort = HostAndPort.from("127.0.0.1:30001"); int connectionTimeout = 5000; int soTimeout = 2000; int maxAttempts = 5; ConnectionPoolConfig config = new ConnectionPoolConfig(); JedisCluster jedisCluster = new JedisCluster(hostAndPort, connectionTimeout, soTimeout, maxAttempts, config); try { System.out.println("set key: " + jedisCluster.set("key", "value")); } catch (Exception e) { // Jika pengecualian ditangkap di blok ini, itu berarti operasi gagal meskipun sudah mencapai jumlah percobaan maksimum (maxAttempts). e.printStackTrace(); }
Redisson
Klien Redisson menyediakan dua parameter untuk mengontrol logika pengulangan:
retryAttempts: jumlah pengulangan. Nilai default: 3.
retryInterval: interval pengulangan. Nilai default: 1500. Unit: milidetik.
Contoh pengaturan pengulangan pada klien Jedis:
Config config = new Config();
config.useSingleServer()
.setTimeout(1000)
.setRetryAttempts(3)
.setRetryInterval(1500) //ms
.setAddress("redis://127.0.0.1:6379");
RedissonClient connect = Redisson.create(config);StackExchange.Redis
Klien StackExchange.Redis hanya mendukung pengulangan koneksi. Contoh pengaturan pengulangan pada klien StackExchange.Redis:
var conn = ConnectionMultiplexer.Connect("redis0:6380,redis1:6380,connectRetry=3");Untuk informasi lebih lanjut tentang mekanisme pengulangan di tingkat API, lihat Polly.
Lettuce
Meskipun klien Lettuce tidak menyediakan parameter untuk pengulangan setelah perintah timeout, Anda dapat menggunakan parameter berikut untuk mengimplementasikan mekanisme pengulangan:
Eksekusi paling banyak sekali: Perintah dapat dieksekusi paling banyak sekali. Jika klien terputus dan kemudian tersambung kembali, perintah mungkin hilang.
Eksekusi minimal sekali (default): Setidaknya satu eksekusi perintah yang berhasil dijamin. Ini menunjukkan bahwa beberapa percobaan mungkin dilakukan untuk memastikan eksekusi yang berhasil. Jika metode ini digunakan dan pergantian master/replika terjadi dalam instance sementara klien melakukan beberapa percobaan pengulangan, sejumlah besar perintah pengulangan mungkin terakumulasi di klien. Setelah pergantian master/replika selesai, pemanfaatan CPU instance mungkin melonjak.
Untuk informasi lebih lanjut, lihat Opsi Klien dan Keandalan Eksekusi Perintah.
Contoh pengaturan pengulangan pada klien Lettuce:
clientOptions.isAutoReconnect() ? Reliability.AT_LEAST_ONCE : Reliability.AT_MOST_ONCE;