Kami telah menerapkan retry_strategy yang mengeluarkan kesalahan setelah sejumlah percobaan ulang. Ini kemudian akan menggelembung ke on('error') handler Redis untuk dicatat dan keluar dari aplikasi. Saat memperbarui perpustakaan redis kami dari 2.4.2
ke 2.6.2
kami melihat bahwa perilaku ini tidak lagi sama.
Kasus repro:
const redis = require('redis');
const MAX_ATTEMPTS = 10;
var client = redis.createClient(port, host, {
retry_strategy: redisRetryStrategy
});
client.on('error', onError);
function OnError(err) {
console.log(err);
throw new Error('SHUTDOWN THE APP, REDIS IS NOT RESPONDING??');
}
function redisRetryStrategy(host, options) {
if (options.attempt >= MAX_ATTEMPTS) {
// Stop reconnecting after reaching the maximum number of attempts
return new Error('Maximum redis reconnect attempts reached');
}
return 1000; // Schedule next reconnection attempt after 1 sec.
}
Ini sebenarnya adalah sesuatu yang dilakukan dengan sengaja. Pasalnya, Anda sudah memiliki informasi bahwa klien gagal, sehingga tidak perlu dipancarkan lagi. Ini memang bukan perubahan yang baik tentang menjaga semver :/ Maaf tentang itu.
Saya ingin mengadakan polling kecil untuk melihat apa yang dipikirkan orang lain. Ping @NodeRedis/contributor @dirkbonhomme
Ya: Gelembungkan kesalahan ke pendengar kesalahan
Tidak: Pertahankan solusi saat ini
Hanya untuk menawarkan kasus penggunaan yang mendukung yang pertama, connect-redis menyediakan logErrors
yang menjadi (tidak jelas) saling eksklusif dengan retry_strategy
jika kesalahan tidak muncul.
new RedisStore({
logErrors: (err) => console.error, // does nothing
retry_strategy: (options) => {
if (options.error.code === 'ECONNREFUSED' || options.error.code === 'ENOTFOUND') {
return new Error('The server could not be found or refused the connection');
}
return 1000;
}
})
@tj
Saya pikir fungsionalitas saat ini baik-baik saja selama itu ada dalam dokumentasi, yang tidak. Saya pikir itu juga dapat diterima untuk menambahkan opsi yang masih akan memunculkan kesalahan yang dikembalikan dari strategi coba lagi.
Mantan.:
redis.createClient({
retry_strategy: ...,
retry_strategy_bubble_up: true or false (default to false to keep existing functionality)
});
Baru saja menghabiskan hari terakhir mencoba mencari tahu mengapa kesalahan tidak dicatat. Sekarang logging ada di retry_strategy callback, semuanya seperti yang saya inginkan di aplikasi saya.
Alih-alih membuang kesalahan, saya secara manual memancarkan peristiwa kesalahan yang dapat ditangkap oleh penangan kesalahan:
retry_strategy: function(options) {
logger.debug('Retry redis connection: ', options.attempt);
// 5 mins
if (options.total_retry_time > 1000 * 60 * 5) {
// End reconnecting after a specific timeout and flush all commands with a individual error
return logger.error('Redis: maximum retry time exhausted');
}
if (options.attempt > 5) {
// End reconnecting with built in error
logger.error('Redis: maximum connection retry reached');
return client.emit('error', 'maximum retry');
}
return 1000 * 2;
},
Gelembung! (atau sesuatu yang lain)
Custom error emitter seperti yang ditulis @alannesta berantakan, retry_strategy
adalah salah satu parameter konstruktor, seharusnya tidak mengakses objek di luar fungsi.
NodeRedis
sudah memiliki sistem acara, gunakan saja!
Karena end
diambil, dan itu berarti "koneksi ditutup", kita dapat menambahkan acara baru (sebut saja "shutdown" untuk saat ini) yang menunjukkan "kami melakukan semua yang kami bisa, koneksi ini mati , mulai sekarang, kami tidak melakukan apa-apa, lebih baik Anda melakukan beberapa pekerjaan pembersihan".
Saya sangat membutuhkan perubahan ini.
Apakah terjadi sesuatu dengan masalah ini?
Apakah ada alasan mengapa ini tidak tetap atau hanya prioritas? Apa manfaat tidak memancarkan acara? Tidak ada cara yang jelas untuk mematikan layanan dengan tidak ada lagi koneksi redis yang berfungsi saat menggunakan retry_strategy
dan itu seharusnya menjadi kasus penggunaan yang cukup mendasar. Solusi terbaik mungkin akan menjadi acara terpisah seperti yang disarankan @AaronJan ..
Saya telah merilis v3.0.0 yang sekarang menggelembungkan kesalahan retry_strategy
dikembalikan hingga error
event listener.
Komentar yang paling membantu
Ya: Gelembungkan kesalahan ke pendengar kesalahan