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
이거 찾는데 2시간 걸림.. 후아..
https://github.com/socketio/socket.io-redis/issues/21#issuecomment-60315678
댓글
댓글 쓰기