첫 주제에 너무 큰 의미를 담지 말자.
해외여행 갈 때 제일 먼저 해야 할 일은 항공편을 예매해야 한다. 그러나 나라별, 월별, 요일별, 시간별 항공편 금액이 천차만별이기 때문에 저렴하게 잘 갔다오려면 금액비교는 필수이다. 예전에는 옵션에서 날짜를 바꿔가며 비교해야 됐어서 꽤나 까다로웠는데 오랜만에 여행가려고 항공편을 찾아보니 날짜별로 최저가를 확인할 수 있도록 뜨더라! 신기해하고 있던 와중에 이 요금 데이터 수집에 대한 데이터 파이프라인 개발글이 있어 리뷰해보기로 했다:)
기술 블로그 출처
https://squarelab.co/blog/how-to-build-flight-fare-data-pipeline-with-argo/
데이터 파이프라인 요약
- 항공권 검색엔진에서 가격 조회를 수행하여 조회된 내용을 AWS S3에 json 형태로 저장
- AWS S3로 부터 저장된 데이터를 읽어와서 적절한 형태로 가공하여 데이터 저장소 (Elasticsearch)에 저장
- 앱에서 API를 호출하면 데이터 저장소로부터 날짜별 최저가 데이터를 한번에 조회하여 응답
이렇게 구성된 데이터 파이프라인은 쿠버네티스 클러스터에서 Argo Events를 통해서 미리 정의된 Argo Workflow를 트리거하여 작업을 수행한다.
Argo Workflow / Argo Events
Argo Workflow란, Kubernetes에서 병렬 작업을 조정하기 위한 오픈 소스 컨테이너 기반 워크플로우 엔진으로, Workflow는 Kubernetes CRD(Custom Resource Definition)으로 구현된다. 또한 복잡한 작업 흐름을 선언적 DSL을 사용하여 정의하고 실행할 수 있다.
* Kubernetes CRD: 쿠버네티스에서 애플리케이션을 개발하다보면 추가적인 기능이 필요하다. 이 때 쿠버네티스에서는 오브젝트를 직접 정의해 사용할 수 있으며 소스코드를 따로 수정하지 않고도 API를 확장해 사용할 수 있다. CRD를 사용하여 쿠버네티스에 yaml파일을 등록해 놓으면 CR을 이용하여 쿠버네티스를 확장할 수 있다.
* 선언적 DSL: 특정 분야에 최적화된 프로그래밍 언어. 일반적으로 프로그램이나 시스템이 어떻게 동작해야 하는지에 대한 세부 사항을 숨기고, 사용자가 더 추상적으로 직관적인 형태로 명세할 수 있게 해준다.
워크플로우를 정의하되 워크플로우의 각각의 스텝을 컨테이너로 정의한다. 워크플로우 스펙을 YAML로 정의하면 실행할 때 마다 컨테이너를 생성해서 작업을 수행하는 개념이다.
기존에 아파치 에어플로우 등 많은 워크플로우 솔루션이 있지만 이러한 솔루션은 컴포넌트가 VM/컨테이너에서 이미 준비되어 돌고 있음을 전제로 하고 각각의 컴포넌트를 흐름에 따라서 호출하는 데 목적이 있다. argo의 경우, 워크플로우를 시작하면서 컨테이너를 배포하고 워크플로우 작업이 끝나면 컨테이너가 종료되기 때문에 실행할 때만 컨테이너를 통해서 컴퓨팅 자원을 점유한다. 따라서 자원 활용면에서 자원을 효율적으로 활용할 수 있다.
Argo Events는 Kubernetes 기반 이벤트 관리 도구로, 클라우드 네이티브 애플리케이션에서 발생하는 이벤트를 감지하고 이를 기반으로 워크플로우를 트리거하는 데 사용된다. 다양한 이벤트 소스들로부터 발생하는 이벤트를 모니터링 하고 있다가 해당 이벤트에 연결된 동작을 트리거 해주는 기능을 제공한다.
이렇게 이해하면 왜 Argo Workflow를 선택했는지 궁금해진다. 비슷하게 대용량 데이터를 처리하는 도구로 Spring Batch 가 있는데 왜 Argo Workflow를 선택했을까? 원문에 의하면 아래와 같다.
- Spring Batch: 어플리케이션이 실행되는 서버 인스턴스 리소스의 최대치 = 데이터 처리 작업을 수행하는 리소스의 최대치, 클라우드 환경에서 분산처리나 병렬처리 작업에 한계가 있음
- Argo Workflow: 쿠버네티스의 클러스터 오토스케일러에 의해 필요에 따라 클러스터 노드가 자동으로 늘어나고 작업이 종료되면 노드가 자동으로 줄어듦, 불필요한 유휴 자원으로 인해 비용을 더 사용하는 것을 절약할 수 있음
따라서 데이터의 규모가 크고 작업이 복잡한 경우 Spring Batch보다 Argo Workflow가 더 적합해보인다.
정리한 내용을 바탕으로 최저가 항공 데이터 파이프라인을 이해해보면, AWS S3에 json파일이 저장되면 Argo Events는 이를 감지할 것이다. 그리고 Argo Workflow 형식으로 기술된 워크플로우를 시작한다. 이 워크플로우는 json 파일을 내려받아 필요한 적절한 형태로 가공한 후 결과물을 데이터 저장소인 Elasticsearch에 저장한다. 이렇게 저장된 데이터를 API를 호출할 때 한번에 조회하여 응답하는 과정을 거치게 될 것이다.
후기
이번 첫 시간엔 Argo Workflow에 대해 배웠다. 역시 데이터 관리 도구는 다양하기 때문에 적절한 상황에서 적합한 도구를 선택하는 건 참 중요한 일인 거 같다. 스타트업 일수록 효율적인 비용관리가 굉장히 중요하므로 이를 담당하는 데이터 엔지니어의 어깨가 더욱 무거울 수 밖에.. 아직 주니어지만 하나씩 공부하고 실무 경험을 쌓는다면 나도 언젠가 혜안을 가질 수 있을 것이라고 믿는다 :-)