비동기 서블릿 우수 사례
비동기 서블릿 기능을 사용하여 요청을 초기화하는 원래 스레드에 바인드되지 않고 수신 요청과 응답을 처리할 수 있습니다.
비동기 서블릿 사용 시 다음 우수 사례를 고려하십시오.
- 애플리케이션은 필요한 비동기 조작마다 새 스레드를 생성하지 않아야 합니다. 최소한 애플리케이션은 스레드 풀을 사용하거나 AsyncContext start(Runnable) 메소드를 사용해야 합니다.
- 클라이언트/브라우저 측에서 AJAX를 사용하여 페이지의 특정 부분을 사용하여 비동기로 업데이트할 수 있습니다.
- 서블릿 컨테이너는 startAsync 명령을 시작한 웹 컨테이너 스레드가 존재할 때까지 완료 및 디스패치에 대한 호출이 시작되지 않도록 합니다. 그러나 서블릿 컨테이너가 동일한 요청과 응답을 동시에 사용하여 복수의 스레드를 처리하지 않습니다. 애플리케이션은 이 경우 자체 동시성 또는 동기화 문제를 처리할 수 있지만 경쟁 조건이나 교착 상태가 발생하기 쉽기 때문에 권장하지 않습니다. 디스패치나 완료 메소드가 고객 작성 스레드나 start(Runnable)로 시작된 runnable에서 호출되면, 디스패치나 완료는 새 스레드에서 즉시 시작할 수 있고 이 호출을 시작한 스레드에서의 요청이나 응답에 대한 추가 수정은 위험합니다. 두 스레드는 요청과 응답에 대한 액세스 권한이 있으며, 두 스레드가 이 오브젝트를 수정하는 경우 부정확한 결과가 발생할 수 있습니다. 그러므로, 디스패치를 호출한 동일 스레드에서 디스패치 후 요청이나 응답에서 메소드를 호출하지 마십시오. 완료 조작이 호출된 후 요청이나 응답에서 메소드를 호출하지 마십시오.
- 비동기 리스너에는 비동기 조작에 대해 시간 한계가 도달하면 시작되는 onTimeout 메소드가 있습니다. 그러나
onTimeout이 다른 스레드에서 실행되는 동안 비동기 조작은 하나의 스레드에서 계속 실행되고 있을 수 있습니다. 이 시나리오는
다중 스레드가 동일 요청과 응답을 동시에 사용하는 가장 일반적인 방법입니다. 이 시나리오에 대한 간단한 방법은
다음과 같이 공유된 AtomicBoolean 메소드를 AsyncListener 및 비동기 조작 모두에서 사용하는 것입니다.
이 방법으로 하나의 스레드만이 응답에 쓰는 액세스 권한을 얻을 수 있습니다.AtomicBoolean isOkayToRun = (AtomicBoolean) request.getAttribute("isOkayToRun"); if (isOkayToRun.setAndGet(false)){ //do a dispatch }
- 웹 컨테이너는 제한시간에 도달하면 start(Runnable) 메소드에 대한 호출에서 큐된 runnable을 취소하려고 합니다. 그러나 중단하면 메모리가 누수되기 때문에 이미 시작된 runnables를 중단할 수 없습니다.
- 제한시간 알림을 수행하는 스레드 수는 매우 작습니다. 클라이언트의 연결이 느리다면 작은 쓰기 조작도 시간이 걸릴 수 있으므로 제한시간에서 집중적인 조작 또는 쓰기 조 작 시도는 권장하지 않습니다. 비동기 제한시간을 사용 안함으로 설정하면, 더 쉽게 OutOfMemory 오류로 실행되거나 TCP 채널 연결의 수가 고갈됩니다. 기본 제한시간은 30초입니다.
- 를 클릭하여 관리 콘솔에서 제한시간 설정 및 AsyncContext start(Runnable) 메소드와 같은 일부 비동기 서블릿 옵션을 구성할 수 있습니다. 웹 컨테이너 구성에 대해 배우려면 웹 컨테이너 설정 주제를 참조하십시오.
중요사항: 비동기 서블릿을 사용하면 ARD(Asynchronous Request Dispatcher) 및 RRD(Remote
Request Dispatcher)는 지원되지 않습니다.
팁: 비동기 서블릿의 메트릭에 대해 배우려면 웹 애플리케이션 카운터를 보십시오.