2017-10-23 3 views
-3

.ajax에 대한 단일 호출이 원격 측으로 돌아올 때까지 60 초마다 반복되는 문제가 있습니다. 이런 식으로 내 문제를 기록하면 긴 응답 호출의 일부를 생각하게 만들지 만 설정하거나 요청하지 않은 것이 있습니다.내 jquery .ajax GET 호출이 아파치 로그에 여러 번 표시되는 이유는 무엇입니까?

내 응용 프로그램은 Apache에서 제공되며 Linux에서 실행되며 동일한 Apache 서버에서 로컬로 호스팅되는 CGI 스크립트를 호출합니다. 이 CGI 스크립트는 백엔드 호출을 작성하고 백엔드 호출이 완료된 후에 만 ​​리턴합니다. 요즘 원격 서버는 돌아 오는 데 몇 분이 아닌 몇 분이 걸리는 경우가 종종 있습니다.

내 webapp logging은 하나의 호출을 보여 주며, 나의 Apache access_log는 그 호출이 60 초마다 반복되는 것을 보여준다. 그래서 CGI 스크립트에 하나의 GET 요청을하고 아파치 로그는 백엔드가 돌아 오기까지 60 초마다 반복되는 요청을 보여줍니다.

그리고 cgi가 계속해서 반복적으로 호출되기 때문에 원격 서비스에 여러 요청을하고 있는데 이는 매우 나쁩니다.

무슨 일입니까?

관련 자바 스크립트 니펫을

let call = { 
    callName: 'AddWithFulfillment', 
    cardholder: 'cardholderRecord', 
    cardholderHash: 'cardholderHash', 
    transactionNumber: 6206419, 
}; 

console.log(new Date().toString(), 'call:', JSON.stringify(call)); 
$.ajax({ 
    data: { 
    task: JSON.stringify(call) 
    }, 
    url: '/cgi-bin/makeCall.sh', 
    dataType: 'json', 
    cache: false 
}).then(
    function success(data, textStatus, jqXHR) { 
    console.log(new Date().toString(), 'success:', JSON.stringify(data)); 
    }, 
    function fail(jqXHR, textStatus, errorThrown) { 
    console.log(new Date().toString(), 'fail:', errorThrown.message, JSON.stringify(data)); 
    } 
); 

관련 bash는 스크립트

#!/bin/bash 
# extract the task from the query string into a workfile 
q_str=$(echo -e ${QUERY_STRING//%/\\x} | sed 's/+/ /g') 
task=$(echo "$q_str" | sed -n 's/^.*task=\([^&]*\).*$/\1/p' | sed "s/%20/ /g") 
echo "${task}" > /tmp/workfile.txt 
rm -f /tmp/workfile.result 
touch /tmp/workfile.result 

# wait for the result file, dump it into stdout & exit 
while [[ 1 ]] ; do 
    if [[ -s /tmp/workfile.result ]] ; then 
     echo -e $(cat /tmp/workfile.result) 
     exit 0 
    fi 
    sleep 1 
done 
exit 1 

대표 콘솔 로그

"Sun Oct 15 2017 13:13:56 GMT-0400 (EDT)" call: {"callName":"AddWithFulfillment","cardholder":" <...omitted...> ","transactionNumber":6206419} 
"Sun Oct 15 2017 14:07:30 GMT-0400 (EDT)" success: {"callName":"AddWithFulfillment","cardholder":" <...omitted...> ","transactionNumber":6206419, "resultId": -1} 

실제 ACCESS_LOG

127.0.0.1 - - [15/Oct/2017:13:56:24 -0400] "GET /cgi-bin/logger.sh?txt1=%22calling.addWithFufilment+sending%3A%22%2C%22%7B%5C%22isProdCall%5C%22%3Atrue%2C%5C%22deviceAlias%5C%22%3A%5C%22JS-0589.1%5C%22%2C%5C%22callName%5C%22%3A%5C%22AddWithFulfillment%5C%22%2C%5C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%5C%22%3A6206419%7D%22&_=1508040892538 HTTP/1.1" 200 20 "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36" 
127.0.0.1 - - [15/Oct/2017:13:56:24 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36" 
127.0.0.1 - - [15/Oct/2017:13:57:24 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36" 
127.0.0.1 - - [15/Oct/2017:13:58:24 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36" 
127.0.0.1 - - [15/Oct/2017:13:59:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36" 
127.0.0.1 - - [15/Oct/2017:14:00:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36" 
127.0.0.1 - - [15/Oct/2017:14:01:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36" 
127.0.0.1 - - [15/Oct/2017:14:02:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36" 
127.0.0.1 - - [15/Oct/2017:14:03:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36" 
127.0.0.1 - - [15/Oct/2017:14:04:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36" 
127.0.0.1 - - [15/Oct/2017:14:05:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36" 
127.0.0.1 - - [15/Oct/2017:14:06:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 - "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36" 
127.0.0.1 - - [15/Oct/2017:14:07:25 -0400] "GET /cgi-bin/makeCall.sh?task=%7B%22isProdCall%22%3Atrue%2C%22deviceAlias%22%3A%22JS-0589.1%22%2C%22callName%22%3A%22AddWithFulfillment%22%2C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> TransactionNumber%22%3A6206419%7D&_=1508040892539 HTTP/1.1" 200 242 "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36" 
127.0.0.1 - - [15/Oct/2017:14:07:30 -0400] "GET /cgi-bin/logger.sh?txt1=%22recording.addWithFufilment+params%22%2C%22%7B%5C%22isProdCall%5C%22%3Atrue%2C%5C%22deviceAlias%5C%22%3A%5C%22JS-0589.1%5C%22%2C%5C%22callName%5C%22%3A%5C%22AddWithFulfillment%5C%22%2C%5C%22cardholder%5C%22%3A%7B%5C%22 <...omitted...> resultId%5C%22%3A-1%2C%5C%22TransactionNumber%5C%22%3A6206419%7D%22&_=1508040897606 HTTP/1.1" 200 20 "http://localhost/enrollment/" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36" 
+0

제임스,이 추가 사항이 충분하기를 바랍니다. –

+0

추가 HTTP 요청을 작성하는 bash 스크립트 일 수 있습니까? – James

+0

하지만 bash 스크립트의 동작은 어떻게 아파치 로그에 요청으로 표시됩니까? jQuery가 어떻게 든 나를 돕는 것처럼 느껴집니다 ... 그리고 그들은 거의 완벽하게 분리되어 있습니다. 원격 시스템이 돌아 오거나 시간이 초과되어 bash 스크립트가 완료 될 때까지는 모두 동일합니다. 나는 아파치가 아파치를 다시 제출한다고 믿기는 어렵다. 아파치는 그 위에 거대한 실행 시간을 가지고있다. 누군가가 언급했을 것이다. –

답변

0

Apache 로그가 거짓말이라고 생각하지 않으면 브라우저가 해당 요청을 반복하고 있습니다. jQuery가 $.ajaxSetup()을 통해 시간 초과로 구성되어 있다고하더라도 (코드에서 $.ajax()이 아닌 것을 볼 수 있기 때문에) jQuery는 자동으로 실패한 요청 AFAIK를 다시 시도하지 않습니다. 어쩌면 귀하의 브라우저가 어떤 이유로 60 초마다 페이지를 새로 고침하여 아약스 요청을 다시 발생시킬 수 있습니까? 어쩌면 일부 브라우저 플러그인이 페이지를 새로 고치고 있을지 모르겠습니다.

어쨌든이 문제에 대한 다른 접근 방식을 제안합니다. long AJAX 호출에 의존하지 마십시오. 다른 브라우저에서 제대로 작동하지 않을 수 있습니다. 예를 들어, IE가 60 초 후에 시간 초과한다고 들었습니다. 최선의 접근법은 즉시 작업이 처리되도록 예약되었다는 응답을 즉각적으로 반환하는 것입니다. 클라이언트는 정기적으로 동일한 끝점을 폴링하여 이번에는 요청 ID를 전달하고 서버는 처리가 아직 보류 중임을 알리거나 처리가 완료되면 결과를 반환합니다. 말이된다?

+0

이 경우 다른 브라우저가 없다는 점에서 운이 좋다. 이것은 리눅스 키오스크이므로 X에서 실행 중이고 터치 스크린에 표시된 google chrome (앱 플래그 포함)을 사용하여 웹 페이지를 볼 때 (자체적으로 만) 게재하는 아파치를 실행 중입니다. 불행히도 물리적 네트워크는 먼 거리에있는 고객 네트워크 내에 있으므로 모든 디버거를 실행할 수도없고 실제 원격 서비스와 통신 할 수도 없습니다. 나는 ajaxSetup()을 사용하지 않았으므로 120 초 마크에서 실패 할 것으로 예상했다. (나는 이것이 디폴트라고 생각했다.) 그러나 나는 그것을 보지 못했다. 내 말은, –

+0

입니다. jQuery는 기본 타임 아웃 기간을 기록하지 않습니다. 나는 그것이 0이 아니라고 생각합니다. 당신이 기계에 쉽게 접근 할 수 없기 때문에 당신이 몰라서 매분마다 한 번씩 페이지를 새로 고칠 수있는 뭔가가 있다고 생각합니다. 이는 위에서 제안한 것과 같이 폴링 시스템을 구현하는 또 다른 이유입니다. 무언가가 페이지를 새로 고치는 경우 주기적으로 요청 상태를 추적하여 추적 할 수 있습니다. 그것은보다 탄력적입니다. –

+0

또한 AJAX 연결이 시간 초과되지 않기 때문에 일부 네트워크 홉이 다운되고 해당 시스템의 연결이 끊어지면 알 수 없습니다. 폴링에 대한 또 다른 이유. 물론 좀 더 복잡한 메커니즘 (예 : 웹 소켓 사용)을 구현할 수는 있지만 폴링은 정상적으로 작동 할 것입니다. –