2012-01-23 2 views
1

timeOut을 사용하여 15 초마다 DIV을 자동 새로 고치는 사이트를 만들었습니다. 이 방법은 상당히 효과적이지만 DIV이 실제로 업데이트되기까지 최대 5 분이 걸릴 수 있습니다. 즉, 스크립트가 변경되기 전에 번 20 번 번을 호출 함을 의미합니다. 값 비싼 대역폭과 서버 성능의 꽤 좋은 낭비 :setTimeout에서 이동 AJAX에서 긴 폴링을 호출하여 시간 초과

나는 그 대신에 Long Polling을하는 것에 대해 많이 읽고 있었고, 나는 그것을 계속 해왔다.

내 AJAX 호출했다 :

intval = window.setTimeout(function() { 
    $.ajax({ 
    type: 'GET', 
    cache: false, 
    url: 'url', 
    beforeSend: function() { $('#timerimg').attr('src', 'img/icons/loading.gif'); }, 
    success: function(data) { $('#ajaxcontent').html(data); }, 
    complete: function() { $('#timerimg').attr('src', 'img/icons/stop.gif'); } 
    }); 
}, 15000); 

이 기능은 반복 유지되는 시간 종료 기능을 한 모든 시간을, 갱신되는 페이지 내부에 배치되었다.

지금 내가 hi.txt하고 지속적으로 완료 한 후 Hello World! 쓰기 제작에 URL을 설정하고 새로운 설문 조사를하고있는 중이 야 경우 간단한 롱 폴링 기능을

(function poll() { 
    $.ajax({ 
    type: 'GET', 
    cache: false, 
    url: 'url', 
    success: function(data) { $('#ajaxcontent').html(data); }, 
    complete: poll, 
    timeout: 30000 
    }); 
})(); 

을 만들 수 http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery을 따르도록 노력했다. 분명히 많은 동시 투표를 의미합니다.

어떻게 수정합니까?

AND :

, 자동 새로 고침 DIV 거대한 SQL-Server 쿼리의 계산에 큰 차트이다. 그래서 어쩌면 그냥 SQL 쿼리 후 .getRows() (원래에 비해)에 약간의 변화가 있었는지 확인해야합니까?

저는 jQuery와 ASP-Classic에서 모든 것을하고 있습니다.

답변

2

긴 폴링은 클라이언트 전용 솔루션이 아닙니다. 긴 폴링을 수행하려면 서버가 변경 될 때까지 호출을 대기해야합니다. 즉, 로그인 한 모든 클라이언트에 대해 동시 연결 중 하나를 사용하게됩니다. 이는 동시성을 제한하는 일부 서비스 공급자의 문제 일 수 있으므로 503을 얻기 전에 ISP 정책을 확인하십시오.

여기에 하나 이상의 문제를 다룹니다. 서버는 마지막 요청을 업데이트해야하는지 여부를 추적하거나 캐시 된 응답을 다시 보내야합니다. 긴 폴링을 사용하는 경우 서버는 변경 될 때까지 연결을 보류합니다.

이전에는 간격 폴링을 사용하고있었습니다. 드문 업데이트를 위해 IE 대역폭의 절반 (동시 최대 2 개)을 할당하는 대신 (서버 측 캐싱을 사용하여) 해당 경로를 계속 제안 할 것입니다. 상황이 변경되지 않은 경우 서버가 귀하의 문의에 대해 "거짓"응답을하도록하십시오.

+0

내 자체 랙 서버가 매우 큰 백본 인터넷 연결에 배치되어 있으므로 동시 연결 제한이 문제가 될 것이라고 생각하지 않습니다. 현재 문제는 화면이 데이터베이스가있을 때 즉시 업데이트되지 않는다는 것입니다. 인터넷에서 여러 블로그를 읽었습니다. 호출 된 .asp 파일에서 SQL 쿼리를 수행하면 데이터베이스에서 원래 데이터를 가져오고 그런 다음 데이터가 변경 될 때까지 반복해서 동일한 데이터를 반복해서 가져 오는 루프를 수행 한 다음 새 데이터를 브라우저로 다시 보냅니다 ... 그러나 이것은 엄청난 양의 대역폭을 생성합니까? – Behrens

+0

데이터베이스 백엔드와 관련하여 데이터가 업데이트 될 때마다 타임 스탬프가 있어야하거나 DBA에게 제공해야합니다. 타임 스탬프를 사용하면 마지막 타임 스탬프를 확인할 수 있습니다. 마지막 설문 조사보다 크면 THEN은 더 큰 쿼리를 한 번 가져옵니다. 당길 때마다 새로운 시간대로 설문 조사를 업데이트하십시오. 또한 긴 설문 조사가 데이터베이스를 망치고 있으면 안됩니다. 잠시 동안 또는 응답성에 대한 유스 케이스가 무엇인지간에 잠자 게하십시오. –

+0

그래서 가장 좋은 방법은 데이터베이스의 각 행에 "마지막으로 수정 된"타임 스탬프를 추가하고 요청의 타임 스탬프를 보류하도록 내림차순으로 상위 1 개의 타임 스탬프를 선택하는 것입니다. 현재 풀에서 더 큰 것이 있으면 데이터베이스에서 모두 선택하고, 수학을 수행하고, 사용자에게 푸시 .. 그것은 매 2 초마다 DB로부터 풀이 될 것입니다. 그러나 돈 문제가 아닌 내부 trafik입니다. 그래서 좋은 해결책이 될 수 있습니까? – Behrens

관련 문제