2013-02-22 3 views
2

채널 API를 사용하는 애플리케이션이 있습니다. 연결은 항상 살아 있어야하며 (24x7) 채널을 연결 해제 할 때마다 새 채널이 자동으로 생성되는 방식으로 구현했습니다. 대부분의 경우 잘 작동하지만 onError() 메소드가 호출되지 않는 시나리오가 있습니다 (예 : 연결된 WIFI 변경 또는 컴퓨터가 잠자기 상태로 돌아 오는 경우). 내 JS 앱은 채널이 그렇지 않을 때도 여전히 살아 있다고 가정합니다.GAE 채널 API - 자바 스크립트에서 소켓이 살아 있는지 확인하십시오.

내가 생각했던 한 가지 해결책은 메시지를 보내달라고 서버에 핑 (ping)하는 것입니다. Keep Alive처럼. 그러나 이것은 서버에 큰 부담입니다. 예를 들어 매 10 초마다 ping 요청을 보내는 1000 개의 클라이언트는 초당 100 요청과 비슷합니다.

그래서 내가 의도하지 않은 방식으로 연결이 로컬에 있는지 확인하여 내 서버에 DoS 연결을 수행하지 않을지 궁금합니다. .

감사

답변

3

클라이언트가 요청하지 않고 연결 유지 메시지를 보내도록 서버에 알리는 GAE cron 작업을 생성 할 수 있습니다. 당신이 가진 고객의 수에 관계없이 그런 식으로, 당신은 단지 10 초마다 1 개의 요청을 가지고 있습니다.

활성 클라이언트 목록을 memacache/datastore에 저장해야합니다.

+0

하지만 서버로부터 요청을 보내서 연결이 살아 있는지 여부를 어떻게 판단 할 수 있습니까? 채널 API는 메시지가 성공적으로 전달되었는지 여부에 관계없이 어떠한 피드백도 제공하지 않습니다. 나는 죽은 채널로 보낼 수는 있지만 그것이 여전히 살아 있다고 가정한다. 고객이 답장을 보내도록 할 수 있습니다. 그런 다음 다시 같은 문제로 돌아갑니다. – budsiya

+0

채널이 살아있을 것으로 기대하십시오. 그러므로 클라이언트는 핑을 정기적으로 기대해야합니다. 시간 초과 기간에 상관없이 채널 메시지를 수신하지 않은 경우 트리거하기 위해 JS에 시간 초과 이벤트를 넣으십시오. 채널이 죽은 경우 클라이언트는 새 채널을 요청해야합니다. – dragonx

+0

가 발생합니다. 귀하의 제안에 감사드립니다. :) – budsiya

0

나는 두려워 메시지를 전송하고 다시 합리적인 기간 오면 확인하기 위해 서버를 요청하는하지만 옵션이 없습니다.

귀하의 JS 응용 프로그램은 주기적으로 연결이 깨지거나 컴퓨터가 잠 갔다 있는지 확인하는 몇 가지 작은 () 정적 파일을 (도 GAE의 외부에있을 수 있습니다) Ping 할 수 있습니다. 그건 싸게 할 수 있지만 당신에게 100 % 보장을주지 않을 것입니다.

+0

정적 파일을 핑 (ping)하면 JS가 인터넷에 액세스 할 수 있음을 알 수 있지만 채널이 아직 살아 있는지 여부는 나타내지 않습니다. – dragonx