Ketahanan koneksi
Coba lagi perintah
Konfigurasikan sambungan klien Anda untuk mencoba kembali perintah dengan backoff eksponensial. Untuk informasi selengkapnya, lihat coba lagi panduan.
Uji ketahanan
Uji ketahanan sistem Anda terhadap pemutusan sambungan menggunakan mulai ulang untuk mensimulasikan patch. Untuk informasi selengkapnya tentang menguji performa Anda, lihat Pengujian performa.
Pengaturan TCP untuk aplikasi klien yang dihosting Linux
Pengaturan TCP default di beberapa versi Linux dapat menyebabkan koneksi server Redis gagal selama 13 menit atau lebih. Pengaturan default dapat mencegah aplikasi klien mendeteksi koneksi tertutup dan memulihkannya secara otomatis jika koneksi tidak ditutup dengan baik.
Kegagalan untuk membangun kembali koneksi dapat terjadi dalam situasi di mana koneksi jaringan terganggu atau server Redis offline untuk pemeliharaan yang tidak diencana.
Kami merekomendasikan pengaturan TCP berikut:
Pengaturan | Nilai |
---|---|
net.ipv4.tcp_retries2 |
5 |
Untuk informasi selengkapnya tentang skenario, lihat Koneksi tidak terbentuk kembali selama 15 menit saat berjalan di Linux. Meskipun diskusi ini tentang pustaka StackExchange.Redis , pustaka klien lain yang berjalan di Linux juga terpengaruh. Penjelasannya masih berguna dan Anda dapat menggeneralisasi ke pustaka lain.
Menggunakan ForceReconnect dengan StackExchange.Redis
Dalam kasus yang jarang terjadi, StackExchange.Redis gagal terhubung kembali setelah koneksi terputus. Dalam kasus ini, memulai ulang klien atau membuat ConnectionMultiplexer
baru akan memperbaiki masalah. Sebaiknya gunakan pola ConnectionMultiplexer
database tunggal sambil memungkinkan aplikasi untuk memaksa koneksi ulang secara berkala. Lihatlah proyek sampel mulai cepat yang paling sesuai dengan kerangka kerja dan platform yang digunakan aplikasi Anda. Anda dapat melihat contoh pola kode ini di mulai cepat kami.
Pengguna ConnectionMultiplexer
harus menangani kesalahan ObjectDisposedException
yang mungkin terjadi sebagai akibat dari membuang yang lama.
Panggilan ForceReconnectAsync()
untuk RedisConnectionExceptions
dan RedisSocketExceptions
. Anda juga dapat memanggil ForceReconnectAsync()
untuk RedisTimeoutExceptions
, tetapi hanya jika Anda menggunakan ReconnectMinInterval
dan ReconnectErrorThreshold
yang banyak. Jika tidak, membuat koneksi baru dapat menyebabkan kegagalan kaskade pada server yang waktunya habis karena sudah kelebihan beban.
Dalam aplikasi ASP.NET, Anda dapat menggunakan implementasi terintegrasi dalam paket Microsoft.Extensions.Caching.StackExchangeRedis alih-alih menggunakan paket StackExchange.Redis secara langsung. Jika Anda menggunakan Microsoft.Extensions.Caching.StackExchangeRedis dalam aplikasi ASP.NET daripada menggunakan StackExchange.Redis secara langsung, Anda dapat mengatur UseForceReconnect
properti ke true:
Microsoft.AspNetCore.Caching.StackExchangeRedis.UseForceReconnect = true
Konfigurasikan batas waktu yang sesuai
Dua nilai batas waktu penting untuk dipertimbangkan dalam ketahanan koneksi: batas waktu koneksi dan batas waktu perintah.
Batas waktu koneksi
connect timeout
adalah waktu klien Anda menunggu untuk membuat koneksi dengan server Redis. Konfigurasikan pustaka klien Anda untuk menggunakan connect timeout
lima detik, memberikan waktu yang cukup kepada sistem untuk terhubung bahkan dalam kondisi CPU yang lebih tinggi.
Nilai connection timeout
kecil tidak menjamin koneksi dibuat dalam kerangka waktu tersebut. Jika ada yang tidak beres (CPU klien tinggi, CPU server tinggi, dan sebagainya), maka nilai connection timeout
pendek menyebabkan koneksi gagal. Perilaku ini sering membuat situasi yang buruk semakin buruk. Alih-alih membantu, batas waktu yang lebih singkat memperburuk masalah dengan memaksa sistem untuk memulai kembali proses mencoba terhubung kembali, yang dapat menyebabkan perulangan koneksi -> gagal -> coba lagi.
Batas Waktu Perintah
Sebagian besar pustaka klien memiliki konfigurasi timeout lain untuk command timeouts
, yang merupakan waktu klien menunggu respons dari server Redis. Meskipun kami merekomendasikan pengaturan awal kurang dari lima detik, pertimbangkan untuk mengatur command timeout
lebih tinggi atau lebih rendah tergantung pada skenario Anda dan ukuran nilai yang disimpan dalam cache Anda.
Jika command timeout
terlalu kecil, koneksi bisa terlihat tidak stabil. Namun, jika command timeout
terlalu besar, aplikasi Anda mungkin harus menunggu lama untuk mengetahui apakah perintah akan mengalami waktu habis atau tidak.
Hindari lonjakan koneksi klien
Hindari membuat banyak sambungan sekaligus saat menyambungkan kembali setelah sambungan terputus. Mirip dengan cara batas waktu sambungan singkat dapat mengakibatkan pemadaman yang lebih lama, memulai banyak upaya penyambungan ulang pada saat yang sama juga dapat meningkatkan beban server dan memperpanjang waktu yang dibutuhkan semua klien untuk berhasil menyambung kembali.
Jika Anda menghubungkan kembali banyak instans klien, pertimbangkan untuk mengejutkan sambungan baru untuk menghindari lonjakan tajam dalam jumlah klien yang terhubung.
Catatan
Saat Anda menggunakan pustaka klien StackExchange.Redis, atur abortConnect
ke false
di string koneksi Anda. Sebaiknya biarkan ConnectionMultiplexer
menangani sambungan ulang. Untuk informasi selengkapnya, lihat Praktik terbaik StackExchange.Redis.
Hindari sambungan sisa
Cache memiliki batasan jumlah sambungan klien per tingkat cache. Pastikan bahwa ketika aplikasi klien Anda membuat ulang sambungan, aplikasi itu menutup dan menghapus sambungan lama.
Pemberitahuan pemeliharaan tingkat lanjut
Gunakan pemberitahuan untuk mempelajari pemeliharaan yang akan datang. Untuk informasi selengkapnya, lihat Dapatkah saya diberi tahu terlebih dahulu tentang pemeliharaan terencana.
Menjadwalkan jendela pemeliharaan
Sesuaikan pengaturan cache Anda untuk mengakomodasi pemeliharaan. Untuk informasi selengkapnya tentang membuat jendela pemeliharaan untuk mengurangi efek negatif pada cache Anda, lihat Memperbarui saluran dan Menjadwalkan pembaruan.
Lebih banyak pola desain untuk ketahanan
Terapkan pola desain untuk ketahanan. Untuk informasi selengkapnya, lihat Cara membuat aplikasi saya tangguh.
Batas waktu jeda
Azure Cache for Redis memiliki batas waktu 10 menit untuk koneksi diam. Batas waktu 10 menit memungkinkan server untuk secara otomatis membersihkan koneksi bocor atau koneksi yang tidak memiliki aplikasi klien. Sebagian besar pustaka klien Redis memiliki kemampuan bawaan untuk mengirim heartbeat
atau keepalive
perintah secara berkala untuk mencegah koneksi ditutup meskipun tidak ada permintaan dari aplikasi klien.
Jika ada risiko koneksi Anda diam selama 10 menit, konfigurasikan keepalive
interval ke nilai kurang dari 10 menit. Jika aplikasi Anda menggunakan pustaka klien yang tidak memiliki dukungan asli untuk keepalive
fungsionalitas, Anda dapat menerapkannya di aplikasi Anda dengan mengirim PING
perintah secara berkala.