2012-05-08 2 views
3

친구와 저는 웹 기반의 AJAX 채팅 소프트웨어를 jQuery와 PHP 코어로 구축하고 있습니다. 지금까지 2 초마다 서버를 호출하거나 업데이트를 찾는 표준 절차를 사용했습니다. 그러나 나는이 방법을 싫어하기 때문에 빠른 것이 아니며, 데이터가 반환되지 않더라도 서버에서 앞뒤로 반복되는 요청이 많아서 "비용 효율적"이라고 할 수 없습니다.Ajax Long Polling Restrictions

프로젝트 지지자 중 한 명이 COMET이라고하는 기술, 구체적으로 Long Polling을 조사하는 것이 좋습니다. 그러나 다른 기사 및 블로그 게시물에서 그것에 대해 읽은 후에, 나는 아파치 서버와 함께 사용하는 것이 실용적이지 않다는 것을 발견했다. 대부분의 사람들은 "좋은 생각이 아닙니다"라고 말하지만 아파치가 한 번에 처리 할 수있는 요청의 양과 관련하여 구체적인 방법을별로주지는 않습니다.

PureChat의 모든 목적은 사람들에게 멋지게 보이고 빠르게 가고 대부분의 서버에서 작동하는 채팅을 제공하는 것입니다. 따라서 우리는 약 96 %의 사용자가 Lighttpd 또는 Nginx가 아닌 Apache를 사용하고 있다고 가정하고 있습니다. Lighttpd 또는 Nginx는 긴 폴링에 더 적합합니다.

포인트에 도착 : 당신의 의견에

를, 그것은 setInterval을 계속 사용하고 반복적으로 새로운 데이터를 요청하는 것이 좋습니다? 또는 대부분의 사용자가 Apache를 사용한다는 사실에도 불구하고 Long Polling을 사용하는 것이 좋습니다. 또한 Apache 서버가 롤오버되고 죽기 전에 얼마나 많은 사람들이 채팅을 사용할 수 있는지에 대한 구체적인 설명을 얻을 수 있습니까?

+2

Tomcat 7에는 WebSocket에 대한 최신 지원이 추가되어 있으므로 폴링 대체를 다른 대안으로 고려하십시오. – Andrew

+0

작은 규모 인 경우 문제가되지 않습니다. 1000 명 이상의 동시 사용자를 계획 중이라면 각 연결마다 새 스레드가 열리기 때문에 Apache는 죽습니다. 이는 많은 양의 메모리를 필요로합니다. NginX는 단일 스레드에서 실행되므로 많은 연결로 확장 할 수 있습니다. 그러나 PHP를 사용하고 있다면 많은 경우 생각만큼 도움이되지 않습니다. 자세한 내용은 내 아래 답변을 참조하십시오. – dqhendricks

답변

2

Andrew가 말했듯이 소켓 연결은 서버와의 비동기 통신을위한 궁극적 인 솔루션입니다. 그러나 현재 가장 최첨단 브라우저 만이 웹 소켓을 지원합니다. socket.io는 브라우저가 지원할 경우 WebSocket 연결을 시작하는 데 사용할 수있는 오픈 소스 API이지만 브라우저가 지원하지 않으면 Flash 대안으로 폴백합니다. 그러나 이것은 API를 사용하는 코더에 투명합니다.

소켓 연결은 기본적으로 브라우저와 서버 간의 개방 통신을 유지하므로 각 서버는 언제든지 서로 메시지를 보낼 수 있습니다. 소켓 서버 데몬은 연결된 가입자 목록을 보관하고 가입자 중 한 사람으로부터 메시지를 받으면 즉시이 메시지를 모든 가입자에게 다시 보낼 수 있습니다.

그러나 소켓 연결의 경우 서버에서 풀 타임으로 실행되는 소켓 서버 데몬이 필요합니다. 이 작업은 명령 줄 PHP (Apache가 필요 없음)를 사용하여 수행 할 수 있지만 non-blocking 서버 측 JavaScript API 인 node.js에 더 적합합니다.

node.js도 긴 폴링에 대해 더 잘 설명합니다. 기본적으로 node.js는 이벤트 기반이며 단일 스레드입니다. 즉, 많은 스레드를 열지 않아도 많은 연결을 열어 둘 수 있기 때문에 많은 메모리를 소비하게됩니다 (Apache 문제). 이는 고 가용성을 가능하게합니다. 그러나 여러분이 염두에 두어야 할 것은 Nginx와 같은 비 블로킹 파일 서버를 사용하더라도 PHP는 많은 네트워크 호출을 차단한다는 것입니다. 그것은 단일 스레드에서 실행되기 때문에 각 MySQL 호출은 기본적으로 해당 MySQL 호출에 대한 응답이 반환 될 때까지 서버를 중단시킵니다. 이 일이 일어나고있는 동안 다른 일은 끝나지 않을 것이며, 비 차단 서버를 쓸모 없게 만들 것입니다. 그러나 네트워크 호출에 자바 스크립트 (node.js)와 같은 비 차단 언어를 사용했다면 문제가되지 않습니다. MySQL의 응답을 기다리는 대신 응답을 처리 할 수있는 핸들러 함수를 설정하여 서버가 대기하는 동안 다른 요청을 처리 할 수 ​​있도록합니다.

긴 폴링의 경우 기본적으로 요청을 보내면 서버는 응답하기 전에 50 초 동안 대기합니다. 보고 할 것이 있으면 50 초보다 빨리 응답하고, 그렇지 않으면 기다립니다.50 초 후에보고 할 것이 없으면 브라우저가 시간 초과하지 않도록 응답을 보냅니다. 응답을 보내면 브라우저가 다른 요청을 보내고 프로세스가 다시 시작됩니다. 이렇게하면 요청이 적고 응답이 좋지만 소켓 연결만큼 좋지는 않습니다.

+0

또한 소켓 서버 데몬은 일반적으로 공유 서버에서 허용되지 않는 서버의 소켓에 대한 액세스를 필요로합니다. VPS가 필요합니다. – dqhendricks

+0

자세한 답변을 보내 주셔서 감사합니다. 대단히 감사합니다. 본질적으로 내가 직면 한 문제는 채팅을 오픈 소스 소프트웨어로 공개하기 때문에 우리는 설치 될 서버를 제어 할 수 없다는 것입니다. 이 점을 고려하여 대다수의 사용자가 공유 호스팅을 사용한다고 가정해야합니다. 따라서 소켓에 대한 액세스 권한이 없거나 Node.js가 설치되지 않을 가능성이 높습니다. 사용자 제한/상한으로 Long Polling을 구현하는 것이 더 좋을 것이라고 생각합니까? –

+0

솔직히, 나는 확실히 모른다. 서로 다른 서버의 메모리 양은 다릅니다. 나는 메모리 양을 반환하는 PHP 함수에 대한 빠른 Google 검색을 수행했습니다. 내가 가진 모든 것은 사용 된 메모리의 양을 반환하는 함수들 뿐이다. –

관련 문제