Node-redis: Langganan tidak menerima data setelah tersambung kembali

Dibuat pada 5 Jul 2017  ·  6Komentar  ·  Sumber: NodeRedis/node-redis

node_redis : 2.7.1
redis : 3.2
platform : Amazon linux
deskripsi:
Saat snapshot redis terjadi, klien redis terputus. Klien menyambungkan kembali dan berlangganan kembali, namun, mereka tidak lagi menerima data. Ini dapat direproduksi dengan mengeluarkan perintah SAVE melalui redis-cli.

JS

const redis = require('redis');
const redisClient = redis.createClient({
  host: config.redisEndpoint,
  port: config.redisPort,
});

redisClient.on('connect', () => {
  console.log('Connected to Redis');
  console.log('subscription_set:', redisClient.subscription_set);
});

redisClient.on('reconnecting', (stats) => {
  console.log('Reconnecting to Redis', stats);
});

redisClient.on('error', (error) => {
  console.log('Failed to connect to Redis: ', error);
});

redisClient.on('subscribe', (channel, count) => { // eslint-disable-line no-unused-vars
  console.log('Subscribed to: ', channel, count);
});

redisClient.on('message', (channel, message) => { // eslint-disable-line no-unused-vars
  console.log('Received from: ', channel, message);
});

redisClient.subscribe('test');

Log

Sambungan awal

info: Connected to Redis
info: subscription_set:
info: Subscribed to:  test 1

Menerbitkan perintah SAVE di redis-cli

info: Error: Redis connection to 34.213.3.19:6379 failed - read ECONNRESET
info: Reconnecting to Redis delay=983, attempt=4, code=ECONNRESET, errno=ECONNRESET, syscall=connect, address=127.0.0.1, port=6379, total_retry_time=1118, times_connected=1
info: Connected to Redis
info: subscription_set: subscribe_test=test
info: Subscribed to:  test 1

Pada titik inilah klien tidak akan lagi menerima data apa pun yang dipublikasikan ke pengujian saluran. Jika Anda memiliki pertanyaan atau memerlukan info lebih lanjut untuk mereproduksi, beri tahu saya.

bug

Komentar yang paling membantu

Oke, akhirnya bisa mereproduksi dengan andal. Ada beberapa persyaratan:

  • redis 3.2.0 - HARUS menyetel tcp-keepalive 0
  • menyiapkan saluran
  • konfigurasikan skrip node untuk menghubungkan, dan berlangganan ke saluran
  • tunggu 2 jam 1 menit

Apa yang akan Anda lihat adalah bahwa setiap 2 jam (setidaknya bagi saya) adalah kesalahan ECONNRESET. Pada titik ini, soket tampaknya masih terbuka dalam redis tetapi mungkin proses node telah kehilangan referensi ke sana dan membuka soket baru? Semalam saya memiliki 1 klien yang terhubung per blok 2 jam ditambah proses yang sedang berjalan saat mengeluarkan CLIENT LIST dari redis-cli.

Penting untuk diperhatikan bahwa semua klien berhasil tersambung kembali tetapi tidak menerima data. Saya memiliki firasat bahwa data sedang didorong keluar, tetapi ke koneksi lama bukan yang baru ... tapi itu benar-benar firasat.

Sekarang, saya tidak 100% yakin apakah ini bug node_redis atau sebenarnya bug dengan node, jadi jika ini adalah tempat yang salah untuk mengajukan, beri tahu saya. Saya akan senang untuk mencoba dan men-debug / melangkah tetapi memiliki waktu terbatas.

Perbaikannya adalah menetapkan tcp-keepalive 300 yang membuat koneksi tetap aktif ... tetapi ini terasa miring karena klien seharusnya dapat berhasil menyambung kembali.

Semua 6 komentar

@BridgeAR @iamjem Mungkin terkait dengan # 1249

Terima kasih atas penjelasan rinci Anda, namun saya belum dapat mereproduksinya. Ketika saya mengeluarkan SAVE melalui redis-cli, koneksi tidak diatur ulang.

Ketika saya menghentikan server redis secara manual dan memulainya lagi, sepertinya saya menerima pesan dengan baik.

Saya telah menguji ini di Mac, akan mencoba mereproduksinya juga di Linux

Hmmm ... itu menarik. Itu terjadi dengan instalasi redis stok total yang dibangun dari sumber. Satu-satunya pilihan yang saya ubah adalah mengizinkan koneksi jarak jauh. Saya akan segera melihatnya dan melihat apakah saya dapat menemukan apa yang terjadi. @jodohgratis

@jdegger Saya tidak dapat melakukan repro secara lokal, hanya di AWS dalam kondisi yang sangat spesifik. Saya dapat membuat salinan kedua dari AMI ini dan memberikan kode yang memungkinkan Anda untuk mereproduksi tetapi tampaknya itu adalah sesuatu yang spesifik untuk dijalankan di AWS. Beri tahu saya jika Anda tertarik ... jika tidak, saya akan mengatakan lanjutkan dan tutup masalah ini

Oke, akhirnya bisa mereproduksi dengan andal. Ada beberapa persyaratan:

  • redis 3.2.0 - HARUS menyetel tcp-keepalive 0
  • menyiapkan saluran
  • konfigurasikan skrip node untuk menghubungkan, dan berlangganan ke saluran
  • tunggu 2 jam 1 menit

Apa yang akan Anda lihat adalah bahwa setiap 2 jam (setidaknya bagi saya) adalah kesalahan ECONNRESET. Pada titik ini, soket tampaknya masih terbuka dalam redis tetapi mungkin proses node telah kehilangan referensi ke sana dan membuka soket baru? Semalam saya memiliki 1 klien yang terhubung per blok 2 jam ditambah proses yang sedang berjalan saat mengeluarkan CLIENT LIST dari redis-cli.

Penting untuk diperhatikan bahwa semua klien berhasil tersambung kembali tetapi tidak menerima data. Saya memiliki firasat bahwa data sedang didorong keluar, tetapi ke koneksi lama bukan yang baru ... tapi itu benar-benar firasat.

Sekarang, saya tidak 100% yakin apakah ini bug node_redis atau sebenarnya bug dengan node, jadi jika ini adalah tempat yang salah untuk mengajukan, beri tahu saya. Saya akan senang untuk mencoba dan men-debug / melangkah tetapi memiliki waktu terbatas.

Perbaikannya adalah menetapkan tcp-keepalive 300 yang membuat koneksi tetap aktif ... tetapi ini terasa miring karena klien seharusnya dapat berhasil menyambung kembali.

@tokopedia

Kami juga menunjukkan bahwa kesalahan ECONNRESET terjadi setiap 2 jam. Tapi saya memeriksa tcp-keepalive, ternyata 300

CONFIG GET tcp-keepalive
1) "tcp-keepalive"
2) "300"
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

Stono picture Stono  ·  6Komentar

yuany picture yuany  ·  4Komentar

twappworld picture twappworld  ·  7Komentar

juriansluiman picture juriansluiman  ·  3Komentar

aletorrado picture aletorrado  ·  6Komentar