Socket.io & socket.io-redis 사용시 주의사항

retry 관련 같은 문제를 격고 있었는데 아래 출처의 내용이 도움이 되었다. 

그래서 개인 기록용으로 출처 내용 가져다 놓았다.

출처 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=bitofsky&logNo=221071064114

 

Socket.io에서 여러개의 인스턴스를 redis pub/sub으로 묶어 broadcast할 때 socket.io-redis를 사용하게 되는데요. 주의사항이 있습니다.


만약 redis가 죽는 경우나 connection에 문제가 생기는 경우를 대비해 redis에는 retry_strategy 옵션이 존재합니다.

헌데, socket.io-redis를 사용하는 경우 retry_strategy가 동작하지 않고 Node 프로세스가 uncaughtException을 받고 죽어버리게 됩니다. (WTF?)

socket.io-redis에 이를 핸들링할 수 있는 에러 핸들러 같은걸 제공하지 않기 때문에 이 상황을 막으려면 다음과 같이 Adapter 연결시에 직접 event emiter에 셋팅을 해야합니다. (WTF??)

const io = require('socket.io')(server);

io.on('connection', socketConnected);
io.on('error', err => console.error('Socket.IO Error', err));

const redis = require('redis');
const pub = redis.createClient(pubClient.port, pubClient.host, pubClient);
const sub = redis.createClient(subClient.port, subClient.host, subClient);

pub.on('error', err => console.error('Redis-Pub Error', err.stack));
sub.on('error', err => console.error('Redis-Sub Error', err.stack));

const IoRedis = require('socket.io-redis');
const ioRedis = IoRedis({ pubClient: pub, subClient: sub });

// !중요 uncaughtException 떨어지지 않도록 여기서 받아주어야 한다.
ioRedis.prototype.on('error', err => console.error('ioRedis Error', err));

io.adapter(ioRedis);

개인적으로.. 공식 문서에도 소개된 모듈이 이런 중요한걸 옵션 설정으로 빼지도 않고 closed된 이슈 코멘트로만 핸들링 방법을 남겨논 것에 대해 매우 충격적입니다.
이거 찾는데 2시간 걸림.. 후아..

https://github.com/socketio/socket.io-redis/issues/21#issuecomment-60315678

댓글

이 블로그의 인기 게시물

[Protocol] WIEGAND 통신

Orange for Oracle에서 한글 깨짐 해결책

[UI] GNB·LNB·SNB·FNB 용어 설명