의료 영상은 Dicom(
.dcm
) 파일이라고 불리며, 파일 하나가몇 MB
이다.
이런 Dicom 파일들이 1개 부터 몇 천개의 묶여서 하나의 의료 영상이 되는데,
이 대용량 파일을 다운로드 하면서 SSE(Server-Sent-Event)를 통해 현재 파일 다운로드 진행 상황을 출력하는 업무를 진행 하던 중 겪었던504 Timeout
문제를 해결했던 내용을 정리 해보려고 한다.
대용량의 파일을 다운로드 하다보면 보통 1~2분 많게는 10분이 넘게 걸리는 경우가 있다.
총 3군데 에서 Timeout이 발생했다.
private static final long DEFAULT_TIMEOUT = 1000L * 60L * 60 //1초 * 60 * 60 = 60분
// ... code ...
SseEmitter emitter = new SseEmitter(DEFAULT_TIMEOUT);
default timeout: 60s (1분)
api 서버가 nginx로 reverse proxy
설정이 되있어 nginx를 타게 되는데 이 때 timeout이 발생
/etc/nginx/conf/hostname.conf
upstream backend {
server 127.0.0.1:8080;
}
# ... 80 port
server {
listen 443;
server_name api.service.com;
root /usr/share/nginx/html;
location / {
proxy_connect_timeout 3600;
proxy_send_timeout 3600;
proxy_read_timeout 3600;
# ...
proxy_pass http://backend;
}
}
A API
서버와 연결되어 Connection을 지속하는 시간이 5분으로 설정되어 timeout 발생
SSE Emitter
에서 한번,
Nginx
에서 한번,
AWS ALB
에서 한번
총 3번에 나눠서 문제를 해결하여 매우 인상적이었다.
나중에 똑같은 문제가 발생하면 이 3가지 경우를 한번에 떠올리게 될 것 같다.