대용량 데이터를 생성하고 다운로드 하는 api가 있는데 데이터가 늘어나다보니 60초 이상이 걸리고 api에서는 timeout이 발생하여 결과를 받지 못하는 상황이 생겼다.

 

개발환경에서 테스트를 하기위해 임시 api를 만든다.

 

url로 /public/10 과같이 값을 입력 받아 Thread.sleep으로 강제 지연을 발생 시킨다.

@Controller
@RequestMapping(value = "/public")
public class HealthController {

	@GetMapping("/{time}")
    public ResponseEntity healthCheck(@PathVariable("time") long time) {
    	try {
        	Thread.sleep(time * 1000L)
        }catch (Exception e) {
        	e.printStackTrace();
        }
    }

}

 

 

nginx의 설정 추가

proxy_read_timeout은 nginx가 백엔드로부터 응답을 받기까지 대기하는 시간이다. 즉 client는 nginx로 요청을 보내고 nginx는 client의 요청을 다시 backend로 보내는데 nginx와 backend 통신이 proxy_read_timeout 기간내로 결과를 주지 못한다면 연결을 끊는다는 의미다.(default는 60초이다.)

location ^~ /public/ {
....
	proxy_read_timeout 120;
....
}

 

변경전에는 /public/61 으로 테스트 할 때 timeout이 발생하였으나, 변경 후 정상적으로 데이터를 받아온느 것을 확인하였다

 

추가적으로 axios(혹은 ajax), tomcat 등의 설정에서 nginx보다 더 작은 값의 timeout이 설정되어 있다면 가장 작은 값을 따라감으로 추가적인 확인이 필요하다.

 

+ Recent posts