파비의 매일매일 공부기록

Two Scoops of Django - #25장 본문

Study/Python

Two Scoops of Django - #25장

fabichoi 2021. 6. 26. 23:30

이번장은 비동기 태스크 큐에 대한 내용이다.

나는 샐러리를 사용하고 있는데 처음에는 이걸 왜 쓰나 했는데.. 실제 업무를 하다 보니 실 서비스에 유용한 앱인 거 같다.

 

비동기 태스크 뷰는 태스크가 실행되는 시점이 태스크가 생성되는 시점과 다르고 태스크의 생성 순서와도 연관 없이 실행되는 작업을 의미. 

 

중개인 : 태스크들이 보관되어 있는 장소. 데이터를 지속적으로 보관할 수 있는 도구라면 뭐든지 가능하나 장고에서는 RabbitMQ와 Redis가 가장 일반적으로 사용됨. 

프로듀서 : 나중에 실행될 태스크를 큐에 넣는 코드. 장고 프로젝트를 구성하는 애플리케이션 코드.

워커 : 태스크를 중개인에서 가져와 실행하는 코드. 일반적으로 하나 이상의 워커가 있음. 각 워커는 데몬 형태로 실행되며 관리를 받음.

 

1. 태스크 큐가 정말로 필요한가? : 상황에 따라 다르다. 태스크 큐를 도입하면 구조가 복잡해지지만 사용자 경험 측면에서는 매우 도움이 된다. 특정 코드에서 병목 현상이 나타날 경우 더 많은 CPU가 가능할 때까지 해당 코드 실행을 잠시 미룰 수 있다.

 - 결과에 시간이 걸리는 경우 : 태스크 큐 이용 ex) 단체 이메일 보내기, 파일 수정 작업(이미지 포함), 서드 파티 API로부터 다량의 데이터 적용, 테이블에 많은 양의 레코드를 추가하거나 업데이트, 긴 시간을 요하는 연산, 웹 훅을 보내거나 받기

 - 사용자에게 바로 결과를 제공해야 함 : 태스크 큐 이용하면 안 됨 ex) 사용자 프로파일 변경, 블로그나 CMS 엔트리 추가

 - 사이트 트래픽에 대한 예외를 항상 고려할 것. 트래픽이 크지 않으면 굳이 필요 없을 수 있다. 트래픽이 많다면 모든 작업에 대해 태스크 큐가 필요할 수 있다.

 

2. 태스크 큐 소프트웨어 선택하기 : 저자는 셀러리, 레디스 큐, django-background-tasks에 대한 비교를 해놨다. 경험에 따른 선택 팁을 정리하면

 - 레디스 큐 : 용량이 적거나 큰 거에 상관없이 추천

 - 셀러리 : 태스크 관리가 복잡한 대규모 프로젝트에 추천

 - django-background-tasks : 특별히 시간이 주기적인 배치 작업을 위한 소규모 프로젝트

 

3. 태스크 큐에 대한 실전 방법론 : 각 패키지마다 특성은 있지만, 일반적인 방법론에 대해 아래에 논한다.

 - 태스크를 뷰처럼 다루자 : 뷰의 경우도 가능한 한 작게 구성하기를 지속적으로 권장했던 것처럼, 태스크도 최대한 작게 구성하는 걸 추천한다. 재사용성 및 디버깅이 간단해진다.

 - 태스크 또한 리소스를 이용한다 : 태스크를 실행하는 프로세스에 대한 메모리와 리소스도 시스템의 어디선가에서 가져오기 때문에 너무 과도하게 사용하면 사이트에 문제를 야기할 수 있다.

 - JSON화 가능한 값들만 태스크 함수에 전달 : 뷰와 같은 태스크 함수의 인자는 JSON화 가능한 값으로 제한할 것. 정수, 부동 소수점, 문자열, 리스트, 튜플, 딕셔너리 타입만 서용. 복잡하게 얽힌 객체를 인자로 사용하지 말 것

 

4. 태스크와 워커를 모니터링하는 방법을 익혀 둘 것 : 태스크 함수를 디버깅하기 위해 태스크와 워커의 상태를 시각적으로 확인할 수 있는 방법을 반드시 익힐 것

 

5. 로깅 : 센트리 같은 도구들을 활용해서 에러가 일어나기 쉬운 태스크들은 로그를 남겨서 디버깅할 것.

 

6. 백로그 모니터링 하기 : 트래픽 증가에 따른 워커 수가 부족해지만 문제 생길 수 있으니 백로그 모니터링할 것

 

7. 죽은 태스크들 주기적으로 지우기 : 때로 태스크가 큐에는 전달되었지만 아무런 반응이 없을 수 있음. 버그 때문일 수 있고 리소스가 없어서 그럴 수는 있으니 시간이 지남에 따라 죽은 태스크들을 지우는 등의 관리가 필요.

 

8. 불필요한 데이터 무시 : 태스크가 완료되면 중개인은 태스크 성공과 실패를 기록하게 되어있음. 이런 데이터는 별 의미가 없으므로 비활성화할 것

 

9. 큐의 에러 핸들링 이용 : 태스크 실패 시 태스크에 대한 최대 재시도 횟수, 재시도 전 지연시간에 대한 설정을 유의할 것. 적어도 10초 이상은 기다리기를 추천

 

10. 태스크 큐 소프트웨어의 기능 익히기 : django-background-tasks는 여러 개의 큐를 처리할 수 없으므로 유의하며, 셀러리는 다양한 라우팅 기능을 제공함을 알고 있어야 함. 결국 사용하는 소프트웨어의 특징을 잘 익히고 활용할 것.

 

반응형

'Study > Python' 카테고리의 다른 글

Two Scoops of Django - #27장  (0) 2021.06.28
Two Scoops of Django - #26장  (0) 2021.06.27
Two Scoops of Django - #24장  (0) 2021.06.25
Two Scoops of Django - #23장  (0) 2021.06.24
Two Scoops of Django - #22장  (0) 2021.06.23
Comments