채팅 앱 스케일링 - 짧은 폴링과 긴 폴링(AJAX, PHP)
저는 브라우저로 채팅할 수 있는 웹사이트를 운영하고 있습니다(페이스북 채팅이라고 생각합니다).라이브 인터랙션을 처리하는 가장 좋은 방법은 무엇입니까?(현재 온라인 사용자 및 새로운 수신 메시지를 업데이트하기 위해 30초마다 폴링을 실시하고 있으며, 새로운 메시지를 받기 위해 채팅 페이지를 초당 폴링하고 있습니다.)
내가 생각한 것:
- HTML5 Web Sockets: 일부 브라우저에서는 동작하지 않기 때문에 사용하지 않았습니다(크롬만 해당).
- Flash Sockets: 최종적으로 모바일 웹을 지원하고 싶었기 때문에 사용하지 않았습니다.
현재 AJAX의 긴 폴링이 얼마나 확장 가능한지 모르기 때문에 짧은 폴링을 사용하고 있습니다.현재 servint에서 VPS 서버를 실행하고 있습니다(apache 실행).긴 폴링과 짧은 폴링 중 어느 쪽을 사용해야 합니까?즉시 응답할 필요는 없습니다(채팅 앱으로 충분합니다).수십만 명의 사용자가 제 서버를 정지시킬 정도로 짧은 폴링이 자주 이루어집니까?이거 어떻게 해? 도와주세요!
몇 가지 주의:
- 매초 여론조사는 과잉 살상이야확인 사이에 몇 초의 지연이 발생해도 앱의 응답성은 매우 높습니다.
- db의 트래픽을 저장하고 응답 속도를 높이려면 메모리 캐시에서 를 사용하여 배달되지 않은 메시지를 저장하는 것이 좋습니다.메시지를 DB에 유지할 수 있습니다.메모리 캐시에 있는는 각 사용자가 x초마다 DB에 쿼리를 보내는 것을 피하기 위해 새로운 메시지에 대한 쿼리에 사용됩니다.
- x초 동안 비활성 상태가 지속되면 사용자의 채팅 시간을 초과하여 서버에 대한 폴링을 중지합니다.이렇게 하면 창을 열어 둔 누군가가 트래픽을 계속 생성하지 않습니다.간단한 제안 "아직도 거기 있어?"[ Continue chating ](채팅을 계속합니다) 세션 링크에서는 타임아웃이 발생하기 전에 사용자에게 경고하여 타임아웃을 연장할 수 있습니다.
- 나는 혜성/긴 투표/급락보다는 투표부터 시작할 것을 제안하고 싶다.폴링은 구축과 지원이 간단하며 단기적으로는 적절하게 확장될 가능성이 높습니다.트래픽이 많은 경우 확장하기 위해 하드웨어와 로드 밸런서를 문제에 할당할 수 있습니다.전체 웹은 폴링을 기반으로 합니다. 폴링은 확실히 확장됩니다.comet/long polling 등 대체의 복잡성이 타당하다고 생각되는 시점이 있지만, 추가 개발 시간/복잡성이 정당화되기 전에 많은 트래픽이 필요합니다.
이것은 옛날 옛적에 cometd와 nodejs가 등장하기 전에 누구나 했던 일이다.
문제는 Apache에서의 PHP 요청은 매우 비싸다는 것입니다.채팅 어플리케이션이 1초마다 메시지를 체크하면 Apache가 요청에 응답할 리소스가 충분하지 않은 상황에 처하게 됩니다.또 하나 개선해야 할 부분은 채팅 어플리케이션의 콘텍스트를 개선하는 것입니다.
새 메시지를 가져오지 않으면 1초마다 업데이트가 되는 이유는 무엇입니까?메시지가 없으면?
사용할 수 있는 몇 가지 기술
채팅 세션에 관한 컨텍스트가 있는 클라이언트, 새로운 메시지 보류 중, 메시지 수 등이 있는 경량 엔드포인트를 제공합니다.클라이언트는 새 메시지가 없는 경우 즉시 업데이트하거나 업데이트하지 않고 응답할 수 있습니다.이 엔드포인트는 http 요청을 통해 단순한 json 개체를 제공할 수 있습니다.이 상태 메시지는 고정 크기임을 보증하며 상태 응답이 변경되지 않으면 메시지를 감쇠시킬 수 있습니다.다음 메시지를 참조하십시오.
javascript 폴링의 단순한 감쇠입니다.클라이언트가 서버로부터 같은 응답을 몇 번 연속 수신하면, 설정 시간만큼 폴링을 늘릴 수 있습니다.현재로서는 매초라고 했습니다.이렇게 하면 2,4,6,8,10초마다 증가합니다.서버로부터의 응답이 변경되는 즉시 붕괴를 리셋합니다.
고려해야 할 몇 가지 최적화
APC와 같은 PHP Opcode 캐시를 사용합니다.
모든 요청의 타임아웃을 낮게 설정합니다.서버를 정지하는 것을 원하지 않습니다.
PHP 코드를 최적화하여 슬림하고 빠르게 만들 수 있습니다.
몇 가지 부하 테스트를 실행하여 제한이 어느 정도인지 확인합니다.
퍼포먼스를 벤치마킹하여 어플리케이션의 속도를 높입니다.
Apache 로그에서 응용 프로그램의 전반적인 상태 및 응답 시간을 나타내는 징후를 확인합니다.
확장이 필요한 경우 새 서버를 추가하고 로드 밸런서를 사용하여 요청을 배포합니다.저는 Varnish와 HAProxy를 성공적으로 사용해 왔습니다.설정은 복잡하지 않습니다.
내가 당신이라면 html5 웹 소켓을 사용하지만 html5를 사용할 수 없는 경우 플래시 소켓에 폴백하는 라이브러리를 선택할 것입니다. 크랙에 빠진 브라우저는 매우 작을 것입니다.
또한 php를 포기하거나 em-websocket과 함께 python 또는 ruby로 작성된 스레드 소켓 서버로 보완해야 합니다.
언급URL : https://stackoverflow.com/questions/5313641/scaling-a-chat-app-short-polling-vs-long-polling-ajax-php
'programing' 카테고리의 다른 글
표시를 거부했습니다.....frame-flashing https://www.facebook.com (0) | 2023.03.05 |
---|---|
외부 설정 방법jQuery를 사용한HTML (0) | 2023.03.05 |
WP REST API에 문자열 파라미터 전달 (0) | 2023.02.28 |
Wordpress JSON API는 html의 일반 사이트 페이지를 반환합니다.어떻게 하면 JSON을 받을 수 있을까요? (0) | 2023.02.28 |
spread 구문 및 typescript에 새로운 Set() 사용 (0) | 2023.02.28 |