node.js를 사용하다가 스케일링에서 이슈가 있어서 netty로 바꿨던 Plurk 개발자의 이야기를 한글로 번역했다. 틀린 내용이 많음..



Plurk (http://www.plurk.com/) 싸이트의 개발자가 node.js를 comet 솔루션으로 적용한 후기를 적은 내용입니다. Plurk는 twitter 같은 서비스인거 같음. 구글 트렌드에 나올 정도면 영향력은 조금 있는 것 같음(http://www.google.com/trends?q=Plurk&ctab=0&geo=all&date=all&sort=1)


출처:
http://amix.dk/blog/post/19577#Is-node-js-best-for-Comet
(번역에 대해서 메일로 허락 받음)

내용:
Plurk 웹 싸이트에서 comet을 이용하여 사용자에게 실시간 업데이트 (트위팅같은거 같음)을 전달해주는 것을 했어. 우리는 scaling 때문에 다양한 솔루션을 시도했지.

1. 첫번째, 우리는 polling을 python으로 구현했었어. 그런데, scaling이 잘 되지 않아서, C, memcached, nginx/libenvent를 이용해서 다시 만들었어.
2. 하지만, C 서버로는 다시 한계에 봉착했지. 두번째로 Java와 Netty를 이용해서 10만 동접을 처리하도록 했다.
3. 그 다음에 node.js를 이용해서 서버단의 cpu와 메모리를 적게 소비하도록 했다.

node.js를 이용했을 때 지난 8개월간은 아주 작동이 잘 되었고, 수백만건의 comet 이벤트(comet notification)를 잘 처리했지. 그러나 이벤트를 처리하면서 이슈가 발생되면서, node.js 최적화 작업을 진행했어.

1. node.js 버젼을 0.1.33 에서 0.2.2로 업그레이드 했다. 0.2.2는 성능이 안좋게 나왔고, 메모리릭이 있었어
2. 데이터 구조를 최적화하고,
3. Redis 사용을 시도했지.
4. Channel에 대해서 Proxy 사용도 해봤어.

최적화 작업은 모두 잘 안되었고, 새로운 하드웨어 장비가 와서 결국 해결 되었지.
(정확한 문제의 원인은 블로그에 나와있지 않음. 어떤 이슈인지 잘 모르겠음. 문맥상 성능 이슈인것 같음)

예전 Netty 솔루션을 다시 적용해서 최적화하고 나서 사용했어. 메모리를 좀 많이 먹었지만, 성능은 좀 더 나아졌어. 하나의 Netty 서버가 약 10,000 클라이언트가 보내는 약 6000개의 comet 이벤트를 처리했어.
반면, node.js 서버는 초당 500개를 처리했지.

node.js가 최고의 comet 솔루션일까?

난 돌아가는 솔루션을 최대한 빨리(ASAP) 사용하고 싶었어. web-scale 을 원한다면, java+nio나 C/C++ 쓰면 될꺼야. node.js는 지난 8개월간 수백만건의 comet 이벤트를 매일 처리해줬지. 난 2일만에 BO를 node.js를 이용해서 구현했어.. 굉장히 심플했거든

그런데. node.js가 사용하고 있는 Javascript 엔진인 V8은 심각한 문제가 있는거 같아.
V8은 쓰레드나 프로세스를 지원하고 있지 않아. 즉, main 프로세스가 처리하고 GC해주거든.

이런 한계 때문에 서버에서 쓰이기 보다는 웹 브라우져에서만 사용되는게 아닌가 싶어.
우리가 node.js를 사용할때, 채널에 대해서 read/write하는게 하나의 프로세스에서 처리되는 부분이 문제야.
채널에 write 하려고 하는데, read하고 gc하는 것때문에 느려진다는 의미를 가지거든.

자바 솔루션은 이런 문제를 쉽게 해결했어. 쓰레드를 돌려 채널 write를 빨리 할 수 있었거든. node.js는 이런게 안되.

끝으로 나는 여전히 node.js가 맘에 들어. 우리가 처음 서비스했을 때, 나름 성능을 제공했어.
우리의 고민들과 경험들이 공유되면 좋겠네.


--
댓글중.
- 이 문제는 커뮤니티에 물어봐. 성능이 너무 안좋게 나온것 같은데.
- node.js가 점점 커가는 중이니까, process/worker 쪽으로는 아직 개발이 덜 된 것 같아. 잠재력이 있으니 기다려보자
- Fugue(https://github.com/pgte/fugue, unix socket 을 이용해서 master/slave를 연동하는 worker 프로세스 모델)을 node.js랑 붙여서 쓰고 있어~
- 우리도 너희랑 비슷한 문제가 있었어
- 그 문제 관련해서 패치가 되었어
- V8 힙이 약간 불안전해.
- node.js에 web worker 방식이 있으니 살펴봐 (https://github.com/pgriess/node-webworker)
- scaling과 관련된 좋은 사례 공유해줘서 고마워
- multiple processing과 관련 이슈인거 같네. 2-3개 물리 장비에 DNS에 붙여서 failover시 다른 장비가 처리하게 해봐
- slow connection에 소켓을 사용하면서 난 이슈인거 있아. 한 장비에 nginx와 HAProxy를 써서 여러개의 인스턴스를 가진 node.js를 로드 밸런스하게 하면 문제가 나타나지 않게 하면 될 것 같아.
  아님 장비를 나눠도 되구


Posted by '김용환'
,