해결된 질문
작성
·
18
·
수정됨
0
Queue에 대한 질문이 몇가지가 있습니다.
큐를 지정할 때는 무조건 큐의 이름을 지정해 줘야 하나요? 자동으로 비어 있는 woker에 큐를 할당하는 방법은 없나요?
cpu_intensive라는 woker에 여러개의 큐가 동시에 요청이 왔을 경우 동기적으로 처리하나요?
큐를 생성하면 해당 큐의 물리적 자원은 어떻게 할당 되는 것인가요?
대체로 하나의 DAG에서 강의에 예시와 같이 여러 개의 큐를 사용하는 경우가 있을까요?
워커를 많이 만들어 환경을 구성하는 사례는 어떤 사례가 있는지 알 수 있을까요?
내용 확인 부탁드립니다.
답변 1
0
안녕하세요 김제원님,
좋은 질문들이 많네요.
큐를 지정할 때는 무조건 큐의 이름을 지정해 줘야 하나요? 자동으로 비어 있는 woker에 큐를 할당하는 방법은 없나요?
=> 꼭 지정할 필요는 없습니다.. BaseOperator(queue="...")를 지정하지 않으면 기본값(default) 큐로 갑니다. Airflow/Celery 설정의 default_queue를 바꾸면 기본 큐 이름을 바꿀 수 있어요.
=> “빈 워커”로의 자동 배정은 큐 단위로만 이뤄집니다. Celery는 “같은 큐를 구독하는(worker -q) 워커들” 사이에서 작업을 분배합니다. “현재 가장 한가한 워커를 자동으로 찾아서” 같은 기능은 같은 큐를 공유할 때에만 자연스럽게 일어납니다(라운드로빈+prefetch 수준).
cpu_intensive라는 woker에 여러개의 큐가 동시에 요청이 왔을 경우 동기적으로 처리하나요?
=> 동기적이라는 말이.. 직렬 처리를 말씀 하시는 건가요? Celery 워커는 기본적으로 worker_concurrency(프로세스/스레드 수)만큼 병렬로 처리합니다. 한 워커가 여러 큐(-q cpu,gpu,io)를 구독하면 각 큐에서 들어온 작업을 하나의 작업 대기열로 합쳐 자신의 동시성만큼 병렬 실행해요. 직렬 처리를 원하신다면, 그 워커를 worker_concurrency=1로 세팅하시면 될 겁니다.
큐를 생성하면 해당 큐의 물리적 자원은 어떻게 할당 되는 것인가요?
=> 큐는 "논리적 라우팅 키"일 뿐, 자원을 직접 할당하지 않습니다. 자원은 Worker에서 알아서 합니다.. 워커 프로세스 수(concurrency), 머신 vCPU/RAM, 컨테이너 리소스 제한(요청/제한), 쿠베라면 노드/네임스페이스 등에서 결정됩니다.
대체로 하나의 DAG에서 강의에 예시와 같이 여러 개의 큐를 사용하는 경우가 있을까요?
=> 가능은 하지만, 너무 많이 하나로 넣는 것은 추천드리지 않습니다.. 일반적으로는 “리소스 클래스별” 소수 큐로 충분합니다. 예를 들면 cpu_intensive, io_heavy, gpu, external_api 이런 식으로 말입니다.
워커를 많이 만들어 환경을 구성하는 사례는 어떤 사례가 있는지 알 수 있을까요?
=> Work Load를 분리할 때 CPU 바운드/IO 바운드/GPU/대용량 메모리 작업을 서로 다른 워커 그룹으로 격리할 때가 있을 수 있겠고 ...멀티 테넌시/팀 분리가 필요할때 팀별 큐/워커로 나눠 소음(노이즈 네이버) 방지 및 운영 책임 분리를 원할때? 쯤이 있을 것 같습니다.