2009-08-14 6 views
5

XHR 객체를 파괴하지 않고 XHR 객체의 responseText를 지우는 방법이 있습니까?Comet, responseText 및 메모리 사용량

라이브 데이터를 브라우저에 제공하려면 웹 서버에 영구 연결을 유지해야합니다. 문제는 상대적으로 많은 양의 데이터 (초당 수백 K)가 있기 때문에 메모리 사용이 큰 문제라는 것입니다. 왜냐하면이 연결은 적어도 몇 분 동안 열려 있어야하기 때문입니다. responseText는 매우 빠르게 커집니다. JSON을 다시 보낼 때 얻을 수있는만큼 작은 크기로 돌려 놓았습니다.

서버 측 응용 프로그램의 작동 방식 때문에 AJAX 스타일의 짧은 폴링을 사용하고 XHR 객체를 끝내면 XHR 객체를 파괴하면 몇 밀리 초 안에 중요한 데이터가 상당 부분 누락됩니다. 응답을 구문 분석하고, 새로운 XHR을 작성하여 전송합니다. 웹 서버는 한 번에 하나의 연결 만 허용하기 때문에 중복되는 요청을 사용할 수있는 옵션이 없습니다. (묻지 마십시오.) 그래서 혜성은 내가 필요한 모델입니다.

내가하고 싶은 것은 서버에서 돌아와서 각 JSON 청크를 구문 분석 한 다음 responseText를 지워서 동일한 연결을 계속 사용할 수있게하려는 것입니다. 그러나 responseText는 읽기 전용입니다. 내가 찾은 방법으로는 직접 비울 수 없습니다.

여기에 그림이 누락 되었습니까? 누구든지 내가 그것을 끝내면 responseText를 비우는 데 사용할 수있는 트릭을 알고 있습니까? 아니면 서버 응답이 갈 수있는 다른 장소가 있습니까?

코드를 포함하지 않기 때문에 실제로 이것은 거의 코드에 무관심한 질문입니다. XHR을 생성하고 반환 된 데이터를 처리하는 Javascript 루틴은 매우 간단합니다.

답변

1

이것은 폴링의 작동 방식입니다. 읽은 마지막 행 번호에 색인을 저장하고 그 간격 이후에 읽은 간격의 각 틱을 유지합니다. 하나의 긴 연결, 따라서 하나의 긴 응답입니다.

신선한 responseText은 신선한 연결을 의미합니다. 그러나 더 이상 혜성이 아닐 것입니다.)

+0

감사합니다. 모델을 이해합니다. 그 연결에서받은 모든 것을 거대한 버퍼에 저장하지 않고 연결을 유지할 수있는 방법이 있기를 바랬습니다. Long-polling은 어쨌든 해킹입니다. 정확히 내가 필요로하는 방식으로 정확히 작동하게하려면 많이 묻습니다. – glomad

+1

@ithcy : 실제로 합리적인 요청처럼 보입니다. 나는 당신이 물어볼 때까지 그것에 대해 결코 생각하지 못했습니다. 'xhr.flushResponseBuffer()'또는 무엇인가는 장시간 실행되는 연결에 유용 할 수 있으며 항상 줄 번호 참조를 저장하지 않아도됩니다. –

4

다른 응답과는 달리 "긴 폴링"은 하나의 긴 연결이 아닙니다. "긴 폴링"은 많은 연결이 연속적으로 이루어지며, 응답이 없어도 각 연결이 적당한 시간 동안 연결 상태를 유지하도록 설정됩니다. 그들은 시간 초과 (일반적으로 약 25-30s), 다음 새 연결을 다시 설정하십시오. HTTP1.1은 기존 연결의 재사용을 허용하기 때문에 연결을 다시 협상 할 필요가 없으므로 즉각적으로 다시 설정할 수 있습니다.

그래서 여러 요청을 사용하십시오. 연결을 다시 설정하는 데는 거의 무시할만한 오버 헤드가 있기 때문에 새로운 연결마다 이전 응답 텍스트를 삭제할 수 있습니다. 이는 성능/오버 헤드 관점에서 완벽하게 실행 가능한 솔루션이며 메모리 문제도 해결할 것입니다.

[편집] 나는 저자의 한 사람인 WebSync으로 경험담을 말하고 있습니다.