일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 영어원서읽기
- 뭐든
- 프로젝트
- leetcode
- 10분
- 개발자
- 쓰릴오브파이트
- 월간
- 3줄정리
- 읽기
- Writing
- FIT XR
- 스탭퍼
- 링피트
- 리얼 클래스
- English
- 화상영어
- 매일
- 파비최
- Daily Challenge
- 영어공부
- 운동
- 30분
- 괜찮음
- 사이드
- realclass
- 미드시청
- 잡생각
- Problem Solving
- 만화도
- Today
- Total
파비의 매일매일 공부기록
Two Scoops of Django - #25장 본문
이번장은 비동기 태스크 큐에 대한 내용이다.
나는 샐러리를 사용하고 있는데 처음에는 이걸 왜 쓰나 했는데.. 실제 업무를 하다 보니 실 서비스에 유용한 앱인 거 같다.
비동기 태스크 뷰는 태스크가 실행되는 시점이 태스크가 생성되는 시점과 다르고 태스크의 생성 순서와도 연관 없이 실행되는 작업을 의미.
중개인 : 태스크들이 보관되어 있는 장소. 데이터를 지속적으로 보관할 수 있는 도구라면 뭐든지 가능하나 장고에서는 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 |