Skip to content

Heroku H12 Request timeout 문제 #6

@kimdg1105

Description

@kimdg1105

개요

어제 테스트로 Bletcher-mix 레포지토리를 헤로쿠에 빌드 및 배포하였고 이후, 정상적으로 두 이미지가 배포 서버에서 합성 및 Cloudinary 업로드 되는 것을 확인하였다.
이 때 테스트한 샘플 이미지는 단순 바탕화면 조각 캡처로, 결과는 별다른 이미지 변화 없이 크기만 바뀌었다.

16008605071727279231490 -> 16105465071612699715644
문제는 이미지를 바꿔서 테스트 했을 때 나타났다.

문제점

로컬 환경에서 blecher-mix Django 서버를 실행하고 위 그림으로 테스트하는 경우, 다음과 같이 문제 없이 합성이 진행되었고 저장소에 업로드되는 것을 확인할 수 있었다.

스크린샷 2021-01-17 오후 4 32 41

하지만, 배포된 'bletcher-mix.herokuapp.com'에 동일한 요청을 보낼 시 에러가 나타났다.
스크린샷 2021-01-17 오후 9 18 53

  • H12 Error
    https://devcenter.heroku.com/articles/error-codes#h12-request-timeout
    : 이 에러의 경우, HTTP request를 수행하는데 30초 이상 걸릴 시 발생한다고 한다. 요청 및 작업 수행에 이상이 없더라도 response 시간이 30초를 넘는다면 무조건 이 에러를 리턴하며, 로그 창 확인 결과, 헤로쿠 프로세스(Worker)는 나머지 일을 마저 수행하는 것을 확인하였다. (즉, Node로는 status 500이 가지만, 기다리면 cloudinary에 합성 이미지만 올라가는 현상)

  • R14 Error
    https://devcenter.heroku.com/articles/error-codes#r14-memory-quota-exceeded
    : 메모리 사용량 초과 에러다. 단순 해결법은 헤로쿠를 업그레이드 하는 것. 아니라면, Gunicorn 설정을 통해 worker 수를 줄여야 한다고 한다.

해결 방안

이를 해결하는 방법으로는 다음과 같은 예시가 있었다.

스크린샷 2021-01-17 오후 9 44 18

위 방법은 HTTP request 이후, 합성하는 프로세스를 백그라운드 워커에게 맡기는 방식인 것 같다. 이를 구현하는 방법으로는 'Celery'가 대표적인 것 같았다.

또한, 이를 사용하기 위해서는 Redis나 RabbitMQ와 같은 작업을 할당할 '브로커' 설정이 필요하다.
작업해야 할 것이 생각보다 많아서 계획을 잘 짜고 시작해야 할 것 같다.

( + 거의 10년 전 사례지만 현재 우리의 문제와 비슷해서 참고) : https://spoqa.github.io/2012/05/29/distribute-task-with-celery.html

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions