มาดูวิธีแก้ redis “The connection is already closed.” กัน

เกริ่นนำ

ก่อนหน้านี้ผมมีปัญหา node-redis ปล่อยไว้นานๆ แล้ว connection close
ทีนี้ตอนแรก ผมก็แก้ด้วยการ client.connected ให้ทำการ createClient ใหม่

แต่ปัญหาคือบางทีมัน createClient ช้า ทำให้โปรแกรมพัง

วิธีแก้

ถ้าต่อใหม่มันช้า ก็ไม่ต้องปิดสิ!!! สิ่งนั้นเรียก heartbeat (ผมเอา keyword นี้มาจาก rabbitMQ)

ผมใช้ keyword นี้ ในการหา lib แล้วก็เจอ redis-pulse
เค้าบอกว่า simple redis heartbeat with “ping”

ซึ่ง ping ก็คือคำสั่งพื้นฐาน redis ping (ทำไมตรูคิดไม่ถึงฟร่ะ – -)

เอา code ของ lib มาให้ดู มัน simple จริงๆ

คือ บรรทัดที่ 20,21 จะเป็น event ที่บอกว่า ถ้า ready หรือ end ให้เรียก function check ด้วยนะ

event ready คือ event ที่เกิดขึ้นครั้งเดียวตอนสร้าง connection สำเร็จ
event end คือ event ที่เกิดขึ้นตอน connection close

การที่เค้าดัก event end น่าจะเพราะเพื่อกรณี close แบบผิดปกติ เช่น network มีปัญหา

ต่อๆ

check บรรทัดที่ 14,15 ถ้า client.connected = true คือ connection ยังอยู่ มันก็จะทำการ ping + delay

แต่ถ้า client.connected = false มันจะเข้าเคส event end ก็แปลกใจว่าทำไมถึงไม่เรียก createClient หรือ ping แทน

client.ping(); ก็ตามนั้นเลยยยยย ping 1 ที
วนลูปไปเรื่อยเป็น heartbeat…..

ตัวอย่างที่ผมนำไปใช้