YTGifer: message queue
아무래도 영상을 다운로드 받다가 타임아웃이 뜨기도 하고, 모르고 엔터 여러번 쳤더니 같은걸 여러번 다운로드 받기도 하고 이런 예외상황들이 생긴다. 다음 작업으로 가기 전에 유튜브 영상 다운로드 받는 부분에 MQ 를 넣어서 처리하기로 했다.
1. 내가 서버에 직접 설치하는 것은 가급적 피하고 싶다.
2. 하지만 비용은 최소한이면 좋겠다.
3. 나만 쓸거니까 퍼포먼스는 크게 상관 없다.
4. 파이썬 바인딩이 쓰기 편해야 한다.
라는 조건을 놓고 여러가지 살펴보았다. kafka, rabbitmq 등등 ... 여러가지를 보다가 digital ocean 에서 managed kafka instance 를 지원해준다는 것을 발견하고 "그래 이걸로 하자!" 싶었으나 가격을 보고 계획을 접었다.
$147 부터 시작이라니 ... 😱😱😱
AWS는 일단 비싸다는 생각이 있어서 안 보고 있었는데, 뭔지 읽어나 보자는 생각으로 Amazon Simple Queue Service 를 찾아가 보았는데 요청 100만개까지 무료라고!??
1위업체라 그런가 대인배다. 바로 Amazon SQS 를 쓰기로 결정.
바로 aws console 에서 access key 하나 생성한 후에 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_DEFAULT_REGION 를 환경변수에 넣었다. 그리고 Simple Queue 하나 생성. 그리고 chatgpt 에게 물어봤다.
시키는대로 하니까 된다. 이제 여기에 다운로드 요청이 오면 url 을 찔러넣고, 다운로더가 처리 완료하면 삭제하도록 돌려보자. 다운로더 프로세스를 여러개 돌리려면 fifo 로 하는게 좋겠지만, 하나만 돌릴거니까 일단 표준 큐로 만들어서 시작.
다운로더는 큐에서 url 을 꺼내어 다운로드를 받으면서 DB 엔트리를 중간 업데이트를 하고, 다운로드가 완료되면 DB에 완료 표시를 하고 해당 엔트리를 queue 에서 삭제한다. 다운로드를 완료한 다음에 사이드 작업도 같이 해도 되겠다. (ex: 썸네일 추출이라거나 whisper 돌려서 스크립트를 뽑거나 등등...)
-> Amazon SQS 를 큐로 쓴 다운로더는 완성. 이제 url 을 마구 밀어넣어도, 하나씩 순차적으로 다운로드 받는다. 일단 set url 하고 나면 중복요청을 해도, 브라우저를 닫아도 상관 없이 consumer process 가 다운로드 받으며 db entry 를 업데이트한다. 나중에 동일 url 로 요청을 하면 다운로드 progress 를 보여주거나, 다운로드가 완료되었다면 바로 영상 링크와 video embed 를 보여준다.