2012-02-23 2 views
2

우리는 모바일 장치에서 Erlang HTTP 서버로의 동시 연결을 엄청나게 유지하려고합니다. 모바일 장치는 물론 간헐적 인 연결을 가질 수 있으므로 가능한 한 빨리 연결을 끊어 오버 헤드를 피하려고합니다.연결을 끊은 후 최대한 빨리 스트리밍 HTTP 연결 끊기

이제는 어떤 수준에서 연결이 끊어 졌는지 감지 할 수 있을지 잘 모르겠습니다. TCP에는 ACK가 필요한 Keepalive 패킷이 있습니다. 그래서 이상적으로 우리는 keepalive 패킷을 15 초 동안 보내고 다음 15 초 내에 ACK를받지 못하면 연결을 끊습니다. 그러나 Erlang에서도 이것이 가능한지 전혀 알 수 없습니다. 또한, 일부 NAT, Wi-Fi 라우터 및 모바일 네트워크가 특정 시간 동안 킵 얼라이브에 대해 응답 할 가능성이 있다고 생각합니다. 잘못된 것이라면 저를 수정하십시오. 이 경우, 그렇다면 '하트 비트'를 수행하는 TCP 수준의 대체 방법이 있습니까?

또한 응용 프로그램 수준의 하트 비트 (HTTP 스트림을 \ n 전송)를 시도했습니다. 그러나 send_timeout을 포함한 모든 적용 가능한 Erlang 옵션을 설정해도 wi-fi 라우터에서 너무 멀리 떨어져있는 모바일 장치와 같은 특정 상황에서는 약 5 분 동안 오류가 발생하지 않습니다.

스트리밍 HTTP 연결을 구현하는 가장 좋은 방법은 서버에서 연락이 끊긴 후 가능한 빨리 삭제하는 것입니다. 어떤 도움을 주시면 감사하겠습니다!

+0

http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html를 참조하십시오. 기성품 HTTP 서버를 사용하고 있거나 사용자 정의 HTTP 서버를 작성하고 있습니까? –

+0

컴퓨터 수준에서 소켓 연결 유지 제한 시간을 구성 할 수 있습니까? – Isac

+0

@asaddude 우리는 우리 자신의 HTTP 서버를 작성했습니다. 가능하다면 우리는 HTTP에 충실하고 요청 후에 양방향성을 사용하지 않을 것입니다. – Max

답변

0

Isac 님의 답변에 따르면 컴퓨터 수준에서 소켓 연결 유지 제한 시간을 구성했습니다. 그것은 단순히 클라이언트에서 무언가를 보내는 것을 권 해드립니다가 HTTP되지 않은 경우

2

HTTP 연결을위한 특정 감시를 추가 할 수 있습니다. 워치 독은 구성 가능한 타임 아웃을 가지며 연결시 각 작업 (읽기 또는 쓰기) 후에 재설정됩니다. 그리고 지정된 타임 아웃 내에 소켓 상에 아무런 연산이 없다면 - 연결은 닫혀있다.

이 방법을 사용하면 부실 연결 (완벽하게 정상적으로 연결되지만 I/O 활동이없는 연결)의 문제를 해결할 수 있습니다. 클라이언트가 통신 범위를 벗어난 경우 - 연결은 지정된 시간 초과까지 지속됩니다. 또한 워치 독 접근법을 사용할 때 keep-alive 메커니즘이 필요하지 않습니다.

유일한 단점은 서버가 끊어진 연결을 즉시 감지하지 않지만 대신 연결 감시에 지정된 시간 제한을 기다리는 것입니다.

관련 문제