Long-Polling 방식과 Polling방식 선택하기
약간 번외로 웹채팅을 구현할 때 long-polling방식과 polling 방식 중 어느것이 효율적인가 장단점을 따져보도록 하겠습니다.
아시다시피 Long-Polling방식은 소켓처럼 거의 실시간으로 응답을 받게 할 수 있습니다.
하지만 만약 100명이 전체 채팅하는 환경을 Long-Polling방식으로 구현한다면 어떻게 될까요?
Long-Polling 구조상 누군가가 말 한마디 하는 순간 100명의 유저가 동시에 응답을 받고, 다시 응답을 받기 위한 호출(Request)을 100명 모두가 동시에 하게 됩니다.
순간적으로 Request Queue가 쌓이게 될테니 서버가 버벅대거나 심하면 뻗을 수도 있겠죠. (참고로 IIS의 Max Request Limits는 5000개 라고 하네요.)
이런걸 self-DDOS라고 해야 하나요? ㅋ
하지만 아까 말했듯이 실시간 응답이 매우 중요한 요소이며, 종종 버벅대거나 뻗어도 상관없을정도로 채팅서버만 물리적으로 분리 해도 되는 환경이라면 Long-Polling도 괜찮은 선택이고,
그 외의 상황이라면 기본적으로 Polling방식의 채팅을 구현하는것이 안정적일 것 같습니다.
Performance Counter로 시스템을 감시해보시면 그 차이가 더욱 명확합니다.
Long-polling 방식은 유저들이 아무말도 안하고 있을땐 리소스를 거의 먹지 않다가, 누군가가 말하기 시작하면 카운터가 불규칙적으로 요동치기 시작합니다. 특히 누가 도배라도 한다면 난리납니다 ㅎㅎ
Polling 방식은 말 하든 안하든 주기적으로 새로고침 할 뿐이니까 일정주기별로 물결 그래프가 그려집니다.
아무래도 Polling방식이 다른 서버 어플리케이션과 함께 동작할 경우 오버헤드를 체크하기 훨씬 쉽겠죠. 하지만 유저가 아무것도 안해도 쓸데없이 리소스를 먹는다는게 아쉽구요.
하지만 Polling 방식으로 구현해도 혹시나 Server Request가 동시에 일어나게 되는 구조로 구현하신다면 Long-Polling의 단점을 그대로 안게 되므로 장점이 없어져 버립니다. 주의해서 개발하시길 바라며,
아무쪼록 웹채팅 구현하시는데 도움이 되셨으면 좋겠습니다. 이만~
약간 번외로 웹채팅을 구현할 때 long-polling방식과 polling 방식 중 어느것이 효율적인가 장단점을 따져보도록 하겠습니다.
- Long-Polling 방식을 선택해야 하는 경우
- 약 3초 미만의 오차로 실시간 응답이 필요한 경우
- 메신저 같이 1:1이나 약 10명 이하의 상대와 채팅하는 경우
- 채팅 서버만 분리 할 수 있는 경우
- ex) Facebook의 웹채팅, Google의 메신저, MSN의 웹메신저 등
- Polling 방식을 선택해야 하는 경우
- 응답이 실시간이 아니어도 괜찮거나 3초 이상의 시간차가 발생해도 무난한 경우
- 약 10명 이상의 상대와 채팅해야 하는 경우
- 다른 서버 어플리케이션과 함께 동작해야 하는 경우
- ex) 전체 채팅이 필요한 웹게임이나 랜덤채팅 등
아시다시피 Long-Polling방식은 소켓처럼 거의 실시간으로 응답을 받게 할 수 있습니다.
하지만 만약 100명이 전체 채팅하는 환경을 Long-Polling방식으로 구현한다면 어떻게 될까요?
Long-Polling 구조상 누군가가 말 한마디 하는 순간 100명의 유저가 동시에 응답을 받고, 다시 응답을 받기 위한 호출(Request)을 100명 모두가 동시에 하게 됩니다.
순간적으로 Request Queue가 쌓이게 될테니 서버가 버벅대거나 심하면 뻗을 수도 있겠죠. (참고로 IIS의 Max Request Limits는 5000개 라고 하네요.)
이런걸 self-DDOS라고 해야 하나요? ㅋ
하지만 아까 말했듯이 실시간 응답이 매우 중요한 요소이며, 종종 버벅대거나 뻗어도 상관없을정도로 채팅서버만 물리적으로 분리 해도 되는 환경이라면 Long-Polling도 괜찮은 선택이고,
그 외의 상황이라면 기본적으로 Polling방식의 채팅을 구현하는것이 안정적일 것 같습니다.
Performance Counter로 시스템을 감시해보시면 그 차이가 더욱 명확합니다.
Long-polling 방식은 유저들이 아무말도 안하고 있을땐 리소스를 거의 먹지 않다가, 누군가가 말하기 시작하면 카운터가 불규칙적으로 요동치기 시작합니다. 특히 누가 도배라도 한다면 난리납니다 ㅎㅎ
Polling 방식은 말 하든 안하든 주기적으로 새로고침 할 뿐이니까 일정주기별로 물결 그래프가 그려집니다.
아무래도 Polling방식이 다른 서버 어플리케이션과 함께 동작할 경우 오버헤드를 체크하기 훨씬 쉽겠죠. 하지만 유저가 아무것도 안해도 쓸데없이 리소스를 먹는다는게 아쉽구요.
하지만 Polling 방식으로 구현해도 혹시나 Server Request가 동시에 일어나게 되는 구조로 구현하신다면 Long-Polling의 단점을 그대로 안게 되므로 장점이 없어져 버립니다. 주의해서 개발하시길 바라며,
아무쪼록 웹채팅 구현하시는데 도움이 되셨으면 좋겠습니다. 이만~
'┣ programming' 카테고리의 다른 글
| 웹채팅 구현시 Long-Polling 방식과 Polling방식 선택하기 (0) | 2011/12/08 |
|---|---|
| [AS3] for (each)구문에서의 변수 scope (0) | 2011/04/07 |
| Open DBDiff - 디비 스키마를 비교해보자. (0) | 2011/01/20 |
| [C#] Connection Timeout 과 Command Timeout (1) | 2010/02/19 |
| [C#] 스레드 동기화를 위한 AutoResetEvent와 ManualResetEvent (2) | 2010/01/10 |
| [C#] 역어셈블로 시퀀스다이어그램을 만들어주는 SequenceViz(or LiveSequence) (0) | 2010/01/09 |
src.zip


