Node.js의 이벤트 루프 특성으로 인해 요청이 이미 콜백으로 전달 된 후 쉽게 처리되지 않도록 할 수 없습니다 기능.요청 시간 초과시 처리 중지 요청
각 이벤트 콜백은 다른 특정 프로세스 흐름이나 이벤트에 연결되지 않기 때문에 콜백이 이벤트 루프 대기열에 추가되거나 현재 처리중인 경우 request.on (' timeout ') 핸들러가 트리거됩니다.
요청이 시간 초과되면 처리를 중단 할 수있는 방법이 있습니까? 이 문제를 부분적으로 해결하기 위해 생각할 수있는 유일한 방법은 요청 중에 요청이 실행되었는지 확인하기 위해 실행되는 각 비동기 콜백의 맨 위에 체크를 추가하는 것입니다. 요청이 만료 된 경우 즉시 반환하고 중지합니다. 연속 콜백.
그러나 제한 시간 초과 요청으로 처리 된 미해결 비동기 호출이 이미있는 경우이 방법으로 문제가 해결되지 않습니다. 이 경우 비동기 처리 (예 : MySQL 쿼리 실행)를 수행중인 모든 연결을 끊지 않는 한 연결이 계속 진행되고 결국 비동기 콜백이 호출됩니다.
apache는 들어오는 요청마다 새로운 PHP 프로세스를 생성하므로 PHP + Apache와 같은 다른 프로그래밍 패러다임에서는 문제가되지 않으므로 요청 시간 초과로 결국 프로세스가 종료되고 전체 실행 흐름이 중지됩니다.
누구든지이 문제를 겪고 있으며 쉽게이 문제를 해결할 수있는 기존의 라이브러리 또는 맞춤 방식을 발견 했습니까?
편집 : 지금 우리가 다음 응답을 반환, 토끼 큐에 요청 데이터를 게시, 분석을 추적하기 위해 들어오는 요청을 처리하는 노드에 구축 된 API를
: 구체적인 예를 추가합니다. 요청이 들어오고 어떤 이유로 처리가 30 초보다 오래 걸리면 시간이 초과되고 오류 응답이 클라이언트로 전송됩니다. 이 시점에서 클라이언트는 동일한 호출을 다시 시도합니다 (분석을 잃지 않음).
그러나 요청 자체와 토끼 발행 요청 간에는 아무런 관련이 없으므로 (게시를 시작한 요청을 제외하고) 해당 데이터의 게시를 중단 할 수있는 방법이 없습니다. 따라서 토끼 서버가 결국 게시 요청 처리를 끝내면 클라이언트가 이제 2 (또는 그 이상) 요청을했기 때문에 중복 데이터가있게됩니다.
처음 요청을 게시를 중단하는 유일한 방법은 요청 시간이 초과되면 토끼 연결을 끊는 것입니다. 이렇게하면 초기 게시가 중단되고 클라이언트의 재시도 요청이 복제를 요청하지 않습니다. 그러나 동일한 유형의 수동 연결 파괴는 요청 전체에서 이루어진 비동기 호출에 대해 수행해야합니다. 타임 아웃이 발생했을 때 5 개의 비동기 호출이 있으면 5 개의 비동기 연결 (토끼, mysql, 몽고 등과의 연결 여부)을 모두 파괴해야합니다.
그러나 문제는 요청 시간이 초과되었을 때 이미 설정된 연결을 넘어선 다. 토끼에 게시하기 전에 요청 시간이 시작된 경우에도 해당 요청을 처리하기 위해 호출 된 함수가 이미 실행되었으며 요청이 시간 초과되어 반환되는지 여러 위치에서 확인하지 않으면 중지되지 않습니다 바로.
id (클라이언트 IP 또는 쿠키 값 등)를 사용하여 전역 객체에 토끼 연결을 저장할 수 있으며 다음 요청시이 연결을 검색 할 수 있습니다. 또한 토끼 연결을 소켓 자체에 저장하고 '닫기'를 듣고 토끼 연결을 끊을 수 있습니다. Killing은 'close'를 호출하거나 플래그를 설정하여 자신의 코드에서 bails하는 것을 의미합니다. 첫 번째 옵션으로 가면, 여러 개의 소켓/HTTP 연결을 단일 서버 '연결'에 수렴시킬 수 있습니다. – DDS
@DDS 지금은 토끼 연결을 요청에 첨부 한 다음 제한 시간이 지나면 연결을 끊습니다. 그러나 전체 요청 흐름을 처리하지 못하도록하는보다 포괄적 인 솔루션을 원합니다. 노드에 완전히 반하는 (각 들어오는 요청에 대해 새로운 프로세스를 생성하는) 노드를 소개하거나 중복/자세한 정보를 표시하지 않는 한 지금은 좋은 방법을 생각할 수 없습니다 (각 비동기 호출 전에 확인을 추가하여 요청 시간이 초과되었습니다). 이 방법들 중 하나는 매우 직관적이지 않습니다. – Sarah
노드 0.11.x를 사용하는 경우 생성기 기반 함수 ([gen-run] (https : // github.co.kr/creationix/gen-run), [suspend] (https://github.com/jmar777/suspend)), 함수를 중단하려는 경우 생성기 함수에 예외를 던지도록 수정할 수 있습니다. 원래의 다음 콜백은 무시됩니다. 그런 다음 '실행중인 기능'(실제로는 일시 중지됨)에서 실제 '중단'통화를 할 수 있습니다. 이것은 본질적으로 각 콜백 호출 후에 점검을하고 함수 이탈로 끝까지 밀어 넣습니다 (오류를 포착하고 무시하지 않는 한). – DDS