본문 바로가기

nodejs

[node.js] Server Side long polling message push

이번에 회사에서 뭐 하나 만들면서 사용한 node.js의 기능 중 socket.io가 있습니다.

사실 node.js를 가장 널리 알린.. 기능 중 하나라는 생각도 드는데요..

소스를 배포하는 툴이 있는데, 배포의 진행 상황을 e-mail과 sms로 알려줍니다.

이걸 한번 realtime message push로 만들어 보고 싶었는데요..


본래 처음 의도는 배포자가 "배포" 이벤트를 발생시키는 순간

배포 요청자에게 메시지를 push하는 기능을 만들고 싶었지만..

자바스크립트를 그리 잘하는 것도 아니고.. 또, 그렇게 하자니 소스 수정이 꽤 많이 되어야해서..


배포자가 배포 할 때의 진행 상황을 특정 테이블(queue)에 넣고

node.js로는 이 테이블을 X초마다 polling하면서 이벤트가 있을 경우 이 내용을

클라이언트로 push하도록 구현을 해보았습니다. (이부분은 김용훈님께서 glider wiki에 구현하셨던 내용에 대해서

설명을 듣고.. 그 방식을 따라하게 되었습니다.)


엄격히 이야기하면 realtime message push하고는 좀 거리가 있습니다...

예전에 ajax로 클라이언트에서 polling하던 기능이 서버로 간.. 정도인듯 한데요..

아무튼.. 파일럿 개발로는 이정도로 충분 할 듯 해서.. 정말 간단하게 구현을 했습니다.


이 소스는 아래와 같습니다.


일단 node.js도 처음이고

무엇보다도 자바스크립트를 잘 못 합니다. 때문에, 아래의 소스는 정말 고칠부분이

많을텐데요.... 고쳐야 할 부분을 알려주시면 정말 좋겠습니다.


node.js에서 사용한 모듈은.. express와 mysql, generic-pool입니다.



message_server.js
//client

소스는 간단합니다.

그냥 message_server.js에서 X초마다 DB 테이블을 polling하고 있다가 데이터가 들어오면 읽어서

클라이언트로 push하고 그 데이터를 삭제합니다.

클라이언트에서는 이벤트를 받아서 화면에 뿌려주고요.. 


--- 2012.10.08 수정

여기서 deploy status 이벤트를 emit 할 때 broadcast로 한번 더 이벤트를 발생시켜야 연결되어 있는 모든 클라이언트가

이벤트를 받을 수 있습니다.


여기서 좀 궁금한것이....


1. 서버에서 startpolling() 함수를 실행하는 위치가 저기보다 더 좋은 위치가 있을 것 같다는 것....

2. deployStatusSocket.on으로 connection 이벤트를 등록 할 때 콜백함수의 파라메터로 socket이 넘어오는데..

책이나 일반 예제에는 이 콜백 함수 안에서 socket을 사용해 클라이언트와 통신을 합니다.

그런데 위 소스에서는 polling후 데이터가 있을 때만 이 socket을 쓰게 되는 케이스라 그걸 굳이 var connedSocket으로 받아서 다시 사용하고 있는데 자꾸 이 부분이 마음에 걸리는 것.... 저런 모양을 염두하고 만든 API가 아닐것 같아서 말이죠..


callback과 클로져에 익숙치 않다보니.. 짜놓고도 불신이 많네요 --;


암튼 위와 같이 구현하니 일단....

배포 진행 상황이 클라이언트에 잘 표시가 됩니다.


근데.. 소스가 자꾸 마음에 걸리네요 ㅎㅎ


그래도 뭐 부족하나마 처음 node.js로 뭔가 해보시려는 분들께 조금이라도 도움이 되었으면 합니다.