Node-redis: mengembalikan Kesalahan dari retry_strategy tidak memancarkan pada (kesalahan) acara

Dibuat pada 21 Jul 2016  ·  10Komentar  ·  Sumber: NodeRedis/node-redis

  • Versi : simpul 4.2.1, redis 2.6.2
  • Platform : Mac OS 10.11.5
  • Deskripsi :

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.
}

Komentar yang paling membantu

Ya: Gelembungkan kesalahan ke pendengar kesalahan

Semua 10 komentar

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

betimer picture betimer  ·  5Komentar

Mickael-van-der-Beek picture Mickael-van-der-Beek  ·  6Komentar

ghost picture ghost  ·  3Komentar

Stono picture Stono  ·  6Komentar

jackycchen picture jackycchen  ·  4Komentar