Socket.io 라는 유명한 Node.js 모듈을 들어보신 적이 있으실 겁니다.
Socket.io는 푸쉬 알림이나 실시간으로 업데이트가 필요한 콘텐츠를 가진 서비스들이 많이 사용하고 있습니다.
문제는 Socket.io
가 심각한 버그 및 메모리 누수가 있고, 활발히 개발되지 않고 있다는 점입니다.
Socket.io에서 SockJS
나 Engine.io
와 같은 다른 라이브러리로 변경하고 싶을 때, 새로운 API를 공부해야하고 기존에 작성되었던 코드를 재작성해야하며, 또 기존 Socket.io 에서 자체 제공하던 기능들이 없을 경우에는 직접 구현을 해야합니다.
Primus
라는 이 모듈이 구세주입니다. 이 모듈은 SockJS
, Engine.io
, BrowserChannel
, Socket.io
모듈 위에서 wrapper로써 사용됩니다.
Primus
는 Socket.io
처럼 room, multiplex, emit, cluster 같은 기능을 자체적으로 지원하지는 않지만, Primus 플러그인으로써 지원하고 있습니다. 어떤 라이브러리를 사용하더라도 Primus와 Primus 플러그인을 사용하면 일관성있으면서도 손쉽게 라이브러리 변경이 가능합니다.
저는 Engine.io
와 SockJS
를 Primus의 transformer로써 사용해봤습니다.
제 경험으로 이 조합들은 매우 안정적이었으며, 활발히 개발되는 모듈들이기 때문에 버그가 생기더라도 패치가 될 수 있을 여지가 많습니다.
설치
다른 transformer를 설치할 수도 있지만 제가 보여드릴 예제에선 SockJS. 를 사용하겠습니다.
Primus` 와 SockJS 를 Node.js 서버에 설치하기
npm install primus sockjs --save
Node.js 에서 설정해주기
var app = express();
var server = require('http').createServer(app);
var Primus = require('primus');
var primus = new Primus(server, { transformer: 'SockJS' });
server.listen(process.env.PORT || 80);
클라이언트 라이브러리 가져오기
위 파일의 맨 끝에 이 라인을 추가한 후 실행해주세요.
primus.save(__dirname +'/primus.js');
primus.js
라는 파일이 프로젝트 디렉토리에 생겼을 겁니다.
그 파일을 웹서버에서 정적 파일용으로 사용하는 디렉토리에 넣어준 후, 브라우저에서 사용하세요.
<script src="/lib/primus.js"></script>
브라우저에서 서버로 접속하기
var primus = Primus.connect(url, { options });
사용 방법
Primus 를 사용할 때 한 가치 규칙만 생각하세요.
모든 보내는 데이터는 write
이고, 모든 보낸 데이터는 data
라는 이벤트를 통해서 받을 수 있다
사용자 A 가 다른 접속자 (여기선 사용자 B 밖에 없음)에게 “ping”이라고 메시지를 보내면, 사용자 B가 다른 접속자 (사용자 A)에게 “pong”이라고 메시지를 보내는 예제를 보여드리겠습니다.
Node.js 서버
primus.on('connection', function(spark) {
console.log('client ' + spark.id + ' has connected to the server');
spark.on('data', function(data) {
spark.write(data);
});
});
사용자 A
primus.write('ping');
primus.on('data', function(data) {
console.log(data);
});
사용자 B
primus.on('data', function(data) {
console.log('ping');
primus.write('pong');
});
플러그인
저는 현재 제 프로젝트에서 primus-cluster
, primus-rooms
, primus-express-session
등의 플러그인을 사용하고 있습니다.
Community Plugins 에서 플러그인을 한번 둘러보시고 필요한 플러그인을 설치해서 사용하세요.
oOBc5EbnNAdxCfJoEGS1x24yQESpuCukvcK2KRb5XCY,