[공부] 파일 다운로드 진행 상황 Toast Message를 개발 하면서

허주환·2023년 6월 20일
1

공부

목록 보기
2/2

0. 서론

의료 영상은 Dicom(.dcm) 파일이라고 불리며, 파일 하나가 몇 MB이다.
이런 Dicom 파일들이 1개 부터 몇 천개의 묶여서 하나의 의료 영상이 되는데,
이 대용량 파일을 다운로드 하면서 SSE(Server-Sent-Event)를 통해 현재 파일 다운로드 진행 상황을 출력하는 업무를 진행 하던 중 겪었던 504 Timeout 문제를 해결했던 내용을 정리 해보려고 한다.

1. Timeout 발생 하는 경우

대용량의 파일을 다운로드 하다보면 보통 1~2분 많게는 10분이 넘게 걸리는 경우가 있다.
총 3군데 에서 Timeout이 발생했다.

I. SseEmitter

  • default timeout: 30s (30초)
  • FE와 Eventsource로 연결하여 파일 다운로드 상태를 전송하는 클래스에 timeout을 설정
  • SSeEmitter를 생성할 때 Timeout 을 1시간으로 설정
private static final long DEFAULT_TIMEOUT = 1000L * 60L * 60 //1초 * 60 * 60 = 60분

// ... code ...

SseEmitter emitter = new SseEmitter(DEFAULT_TIMEOUT);

II. Nginx proxy 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;
    }
}

III. AWS ELB idle timeout

  • default timeout: 60s (1분)
  • 설정되어 있던 timeout: 300s (5분)
  • api 서버가 ALB로 분산처리 되어 있음
    • A API Server
    • B API Server
    • ... API Server
  • ALB에서 A API서버와 연결되어 Connection을 지속하는 시간이 5분으로 설정되어 timeout 발생
  • 300s에서 3600s(1시간)로 수정하여 해결
    idle_timeout

2. 결론

SSE Emitter에서 한번,
Nginx에서 한번,
AWS ALB에서 한번
총 3번에 나눠서 문제를 해결하여 매우 인상적이었다.
나중에 똑같은 문제가 발생하면 이 3가지 경우를 한번에 떠올리게 될 것 같다.

Reference

  • ELB 종류 (링크)
  • SSE (Server-Send Event) 를 이용한 다운로드 진행 상황 표시 (링크)
  • Nginx connection timeout 시간 설정 (링크)
  • AWS Elastic Load Balancing Connection Timeout Management (링크)
profile
Junior BE Developer

0개의 댓글