2013-04-01 3 views
2

서블릿 컨테이너가 독립 실행 형 서버로 작동 할 때 활성 상태가 지속되지 않는다고 가정하면 전체 응답이 클라이언트에 전송 될 때까지 서블릿의 스레드가 해제되지 않는다고 가정합니다 (예 : 웹 브라우저) . 이것은 올바른 가정입니까?언제 서블릿이 스레드를 해제합니까

하지만 서블릿이 Nginx와 같은 역방향 프록시 뒤에 있으면 어떻게됩니까? 응답이 Nginx에 전달되면 스레드가 해제 되나요? 아니면 응답이 최종 클라이언트 (예 : 브라우저)에 전송 될 때까지 대기 중입니까?

업데이트 : 조금 더 명확하게 해 드리겠습니다.

서블릿에서 nginx와 같은 프록시로 응답을 보내려면 단지 밀리 초 (2ms)가 걸립니다. 그러나 nginx에서 브라우저로 최종 응답을 보내려면 추가로 80ms가 걸릴 수 있습니다. 서블릿은 일단 응답이 nginx로 보내지면 스레드/스트림을 릴리스합니까? 아니면 응답이 브라우저에 전송 될 때까지 서블릿이 응답하지 않습니다 (즉, 전체 80ms)

+0

컨테이너가 프록시 뒤에 있다는 것을 알지 못하므로이 점이 아무런 차이가 없습니다. 일반적으로 컨테이너는 스레드 풀을 사용하므로 스레드가 무기한 보관됩니다. –

+0

하지만 서블릿의 출력은 먼저 nginx 버퍼/스트림으로 이동합니까? 서블릿은 응답이 완전히 보내 졌다고 생각할 수 있으므로 서블릿은 스트림을 닫고 스레드를 풀로 해제합니다. nginx와 서블릿 간의 통신은 몇 밀리 초가 걸리는 반면 최종 응답이 브라우저에 도달하는 데는 80 마일이 필요합니다. 서블릿이 연결/스레드 전체를 유지하는지 아니면 Nginx로 보내는 데 걸리는 시간인지를 나타냅니다. – adamSpline

답변

2

질문 : 서블릿의 스레드 전체 응답이 클라이언트 (예 : 웹 브라우저)에 전송 될 때까지 해제되지 않습니다. 이것은 올바른 가정입니까?

응답 수 : 아니요. 서블릿 컨테이너는 콘텐트를 소켓에 쓰고 리턴한다. write() 메서드에서 반환하면 응답이 클라이언트에 도달했는지 확인할 수는 없습니다.

질문 : Nginx에 응답이 전달되면 스레드가 해제 되나요? 아니면 최종 클라이언트 (예 : 브라우저)에 응답이 전송 될 때까지 스레드가 대기 중입니까?

Ans : Nginx가 뒤에있을 때 Servlet 컨테이너의 클라이언트는 Nginx입니다. 실제 원격 클라이언트를 인식하지 못합니다. 따라서 Nginx에 응답이 기록되면 스레드가 해제됩니다.

1

서버 컨테이너를 보낼 수 없습니다. 클라이언트에 대한 응답은 컨테이너에 의해 처리 될 예외를 트리거합니다. try (try (close())를 사용하여 trystream이나 writer에 쓰기를 묶을 수 있지만 필요하지는 않습니다. 컨테이너가 스레드를 풀로 반환하는 것을 포함하여 관리합니다. 감사합니다. S

+0

나는 당신의 대답을 이해하고 있는지 잘 모르겠습니다. 그래, 그것은 컨테이너에 의해 관리됩니다, 나는 단지 "때"스레드/스트림 릴리스/폐쇄 궁금합니다. 특히 그것이 nginx와 같은 것의 뒤에있을 때. – adamSpline

+0

nginx 버퍼 설정을 살펴 보았습니다. nginx의 버퍼가 전체 응답 스트림을 담을만큼 충분히 크면 응용 프로그램 서버가 즉시 닫힙니다. 그렇지 않으면 전체 스트림이 플러시되거나 시간 초과가 발생할 때 닫힙니다. 애플리케이션 서버에 로그 메커니즘을 설정하고 다양한 가능성과 타이밍을 측정해야합니다. – stbas

1

서블릿에 네트워크가 표시되지 않습니다. specifications에 따르면이 개체는 요청 및 응답을 채우는 두 개의 개체로 처리됩니다 (HTTP의 경우 HTTPRequest 및 HTTPResponse를 의미 함). 요청 객체 내의 요청 데이터를 처리하고 응답 객체의 버퍼에 기록한다. 그 내용이 서블릿에 의해 으로 커밋되면 컨테이너는 필터를 사용하여 약간의 후 처리를 수행하고 클라이언트로 다시 전송합니다.

방법은 추가 작업을 할 경우 요청 처리 방법 완료에 대한 호출 (즉, 페이로드 후 발생할 수는 클라이언트로 다시 전송되면 서블릿 스레드 풀에 자연적으로 반환합니다.

참고 서블릿은 네트워크를 보지 않고 단일 요청에만 관심이 있기 때문에 http 연결 상태 (keep-alive 또는 close)는 서블릿 수명과는 독립적이며 여러 서블릿이 단일 연결에서 파이프 라인 된 다른 요청을 처리 할 수 ​​있습니다 관련 문제는 question을 참조하십시오.

관련 문제