[Django] pending되는 이슈에 대한 고찰

2022. 8. 2. 15:30TIL/Django

회사 프로젝트 진행 중 당황스러운 일을 겪었다.

영상 업로드 요청에 대해서 긴 시간이 걸렸다(엄청나게 길진 않지만 거의 1분 가까이 걸렸다). 그 이유는 한 번의 요청에 여러 이벤트가 발생했다는 점.

  1. 영상 파일을 웹서버에 업로드
  2. 업로드된 파일을 mp4파일로 변환(FFMPEG 사용)
  3. 업로드된 파일을 raw파일로 변환(FFMPEG 사용)
  4. 위에 변환된 두 파일을 NAS에 저장
  5. mp4로 변환된 파일을 외부 storage에 저장
  6. 4번에서 NAS에 저장된 두 파일의 path를 DB에 저장하고 client에 리턴

이렇게 한 번에 많은 것을 처리하기 때문에 업로드 요청 시간이 오래 걸리게된다.

아키텍처를 내가 설계했다면 이런 식으로 하지 않았겠지만 기존 레거시 코드를 기반으로 마이그레이션했기 때문에 어쩔 수 없이 이런 식으로 설계했다.

영상 업로드 시 pending되는 현상

영상을 업로드하게 되면 이런 식으로 해당 요청에 pending이 걸리면서 요청이 지연된다. 이 요청만 지연되면 아무런 상관이 없겠지만 지연이 된 상태에서 다른 요청을 하게 되면 해당 요청들 까지 지연된다. 즉, 업로드 요청이 진행 중일 때 다른 요청이 들어오면 업로드 요청이 진행 완료될 때 까지 다른 요청들도 지연된다. 심지어는 해당 요청을 보낸 유저 이외에 다른 유저의 요청까지 pending이 걸려버린다.

 

크리티컬한 이슈이기 때문에 해결책을 강구해야했다. 아는 것이 많지는 않지만 여러 방법을 고안해 보았다.

 

  1. 서버 분리
    • 다른 서버에 해당 로직을 처리할 수 있게 서비스 분리
    • 서버 간 통신은 gRPC나 REST API로 진행
  2. 웹소켓 통신
  3. 비동기 처리

이 중에서 가장 쉽게 처리할 수 있는 방법은 서버 분리 후 REST API로 서버 간 통신하는 방법이라고 생각했고, 해당 방법으로 이슈 해결을 하려고 한다.

 

이슈가 해결된 후에 해결 과정을 또 올릴 것이다.

반응형

'TIL > Django' 카테고리의 다른 글

[Django] connection.queries always empty  (0) 2022.10.13
[Django] DRF란?  (0) 2022.10.12
[Django] Logging Handler  (0) 2022.04.28
[Django] Logging 설정  (0) 2022.04.26
[Django] timezone  (0) 2022.04.15