4P by GN⁺ | ★ favorite | 댓글 1개
  • Netflix가 대규모 Data/ML 워크플로우용 수평 확장 오케스트레이터 Maestro를 오픈소스로 공개했고, 내부에서는 수십만 개 워크플로우를 최소 중단으로 이전해 운영 중임
  • DAG 중심 오케스트레이터와 달리 비순환·순환 워크플로우를 함께 다루며, foreach 루프·서브워크플로우·조건 분기를 엔진 수준 패턴으로 제공함
  • 지난 1년간 실행 작업 수가 87.5% 증가했고, 현재 하루 평균 수천 개 워크플로우 인스턴스와 약 50만 개 작업을 실행하며 바쁜 날에는 약 200만 개 작업을 완료함
  • JSON 기반 정의에 실행 전략, 파라미터, SEL 표현식, 신호, 브레이크포인트, 타임라인, 재시도 정책, 롤업을 결합해 운영 제어와 디버깅을 지원함
  • Netflix처럼 데이터 테이블이 단일 데이터 웨어하우스에 모인 환경에서는 워크플로우를 여러 클러스터로 나누면 조정 비용과 사용자 경험 저하가 커져, 단일 오케스트레이터가 전체 흐름을 맡는 구조가 중요함

Maestro 공개와 Netflix 내 운영 규모

  • Netflix는 Maestro GitHub repository를 통해 Maestro 소스 코드를 공개함
  • Maestro는 데이터 파이프라인과 머신러닝 모델 학습 파이프라인 같은 대규모 Data/ML 워크플로우를 관리하는 수평 확장 워크플로우 오케스트레이터
  • 워크플로우의 시작부터 종료까지 전체 수명주기를 관리하며, 재시도·큐잉·컴퓨트 엔진으로의 작업 분배를 처리함
  • 사용자는 비즈니스 로직을 Docker 이미지, 노트북, bash 스크립트, SQL, Python 등 다양한 형식으로 패키징할 수 있음
  • Netflix는 기존에 소개한 뒤 수십만 개 워크플로우를 Maestro로 이전했고, 전환 과정에서 사용자 중단을 최소화함
  • 최근 운영 규모:
    • 지난 1년 동안 실행 작업 수가 87.5% 증가
    • 하루 평균 수천 개 워크플로우 인스턴스 실행
    • 하루 평균 약 50만 개 작업 실행
    • 바쁜 날에는 약 200만 개 작업 완료

단일 오케스트레이터로 확장성과 다양성 지원

  • Maestro는 Netflix 내부에서 수천 명의 최종 사용자, 애플리케이션, 서비스에 Workflow-as-a-Service를 제공하는 완전 관리형 오케스트레이터임
  • ETL 파이프라인, ML 워크플로우, AB 테스트 파이프라인, 여러 스토리지 간 데이터 이동 파이프라인을 지원함
  • 수평 확장 구조는 많은 워크플로우 수와 단일 워크플로우 내부의 많은 작업 수를 모두 처리하도록 설계됨
  • Netflix의 워크플로우는 서로 촘촘히 연결되어 있어, 작은 그룹으로 나눠 여러 클러스터에서 관리하면 추가 조정 메커니즘이 필요하고 사용자 경험이 떨어짐
  • 데이터 테이블이 단일 데이터 웨어하우스에 있으므로, 여기에 접근하는 모든 워크플로우를 단일 오케스트레이터가 처리해야 한다는 판단임

워크플로우 정의 모델

  • Maestro의 워크플로우 정의는 JSON 형식으로 작성됨
  • 사용자 제공 필드와 Maestro 관리 필드를 결합해 오케스트레이션 정의를 구성하며, 예시는 Maestro repository wiki에 있음
  • 워크플로우 정의는 크게 두 영역으로 나뉨
    • properties: 작성자·소유자 정보와 실행 설정 포함
    • versioned workflow: 워크플로우 메타데이터와 그래프 정의 포함
  • properties는 워크플로우 버전이 바뀌어도 작성자·소유자 정보, 실행 전략, 동시성 설정 같은 핵심 속성을 보존함
  • 소유권이 바뀐 경우 새 워크플로우 버전을 만들지 않고 새 소유자가 기존 워크플로우 소유권을 가져올 수 있음
  • versioned workflow는 고유 식별자, 이름, 설명, 태그, 타임아웃 설정, 우선순위화를 위한 criticality 수준 low·medium·high를 포함함
  • 워크플로우 변경은 새 버전을 만들며, 기본적으로 활성 버전이나 최신 버전이 사용됨
  • 워크플로우는 사용자가 정의한 그래프의 노드인 step으로 구성됨
    • step은 작업, subworkflow step을 통한 다른 워크플로우, foreach step을 통한 루프를 나타낼 수 있음
    • step에는 고유 식별자, step 유형, 태그, 입출력 파라미터, 의존성, 재시도 정책, 실패 모드, step 출력 등이 포함됨
    • 오류 유형별로 설정 가능한 재시도 정책을 지원함

실행 순서를 제어하는 Run Strategy

  • Maestro는 사전 정의된 run strategy로 새 워크플로우 인스턴스를 실행할지 결정함
  • Sequential Run Strategy

    • 기본 전략이며, FIFO 순서로 한 번에 하나씩 실행함
    • 이전 실행의 성공 여부와 무관하게, 인스턴스가 성공 또는 실패 같은 종료 상태에 도달하면 큐의 다음 인스턴스를 시작함
  • Strict Sequential Run Strategy

    • 트리거된 순서대로 실행하지만, 이전 인스턴스 이력에 blocking error가 있으면 실행을 막음
    • 실패한 인스턴스를 수동으로 재시작하거나 unblock 처리할 때까지 새 인스턴스는 큐에 남음
    • 시간 민감도는 낮지만 비즈니스 중요도가 높은 워크플로우에 유용함
  • First-only Run Strategy

    • 실행 중인 워크플로우가 완료되기 전에는 새 인스턴스를 큐에 유지하지 않음
    • 현재 실행 중인 인스턴스가 있으면 새로 큐에 들어온 인스턴스를 제거해 큐잉을 사실상 끔
    • 새 인스턴스를 쌓지 않아 멱등성 문제를 피하는 데 도움됨
  • Last-only Run Strategy

    • 항상 가장 최근 트리거된 인스턴스가 실행되도록 함
    • 기존 실행 중 인스턴스가 있으면 중단하고 새로 트리거된 인스턴스를 실행함
    • 매번 전체 테이블의 최신 스냅샷을 처리하는 워크플로우처럼 최신 데이터만 필요한 경우에 유용함
  • Parallel with Concurrency Limit Run Strategy

    • 사전 정의된 동시성 한도 안에서 여러 인스턴스를 병렬 실행함
    • 많은 데이터를 제한 시간 안에 처리하도록 실행을 fan-out하고 분산할 수 있음
    • 오래된 데이터 백필이 일반적인 사용 사례임

파라미터와 SEL 표현식

  • Maestro에서 파라미터는 실행 로직 제어, 워크플로우와 step 간 상태 공유, 업스트림과 다운스트림 step 간 상태 공유에 쓰임
  • Maestro는 코드 주입을 동반한 동적 파라미터를 지원해 복잡한 파라미터화 워크플로우를 정의할 수 있게 함
  • 코드 주입은 보안과 안정성 위험을 만들 수 있음
    • 사용자가 무한 루프를 작성해 배열에 계속 항목을 추가하면 서버가 OOM으로 중단될 수 있음
    • 주입 코드를 비즈니스 로직 안으로 옮기면 사용자 부담이 늘고 워크플로우 정의와 비즈니스 로직이 강하게 결합됨
  • Netflix는 이를 완화하기 위해 자체 표현식 언어인 SEL(Simple, Secure, and Safe Expression Language) 을 개발함
  • SEL은 Java Language Specifications의 문법과 구문을 따르되 Maestro 사용 사례에 맞춘 부분집합을 지원함
  • SEL은 Maestro 파라미터 타입의 데이터 타입, 오류 발생, 날짜·시간 처리, 사전 정의 유틸리티 메서드를 지원함
  • 안정성을 위해 루프 반복 제한, 배열 크기 검사, 객체 메모리 크기 제한 같은 런타임 검사를 포함함
  • SEL 문서는 Maestro GitHub documentation에 있음

출력 파라미터와 파라미터화 워크플로우

  • Maestro는 callable step execution을 통해 사용자 실행 결과를 출력 파라미터로 시스템에 돌려줄 수 있음
  • 출력 데이터는 Maestro REST API를 통해 전달되며, step 런타임이 Maestro 데이터베이스에 직접 접근하지 않음
  • 정적 워크플로우는 단순하지만 작은 차이를 반영하려면 같은 워크플로우를 여러 번 복제해야 할 수 있고, 파라미터 없이는 워크플로우와 작업이 상태를 공유할 수 없음
  • 완전 동적 워크플로우는 관리와 지원이 어렵고, 디버깅·문제 해결·재사용도 힘듦
  • 파라미터화 워크플로우는 사용자 정의 파라미터를 기반으로 런타임에 step별로 초기화되어, 실행 시점 제어의 유연성과 관리 가능성을 함께 제공함
  • Maestro의 파라미터 지원은 백필 데이터 파이프라인 같은 복잡한 파라미터화 워크플로우 생성을 가능하게 함

엔진 수준의 워크플로우 실행 패턴

  • Maestro는 공통 데이터플로우와 워크플로우 패턴을 엔진에서 직접 지원함
  • 엔진 직접 지원으로 패턴 최적화와 일관된 구현 방식이 가능해짐
  • Foreach

    • foreach 패턴은 원래 워크플로우 정의 안의 전용 step으로 모델링됨
    • foreach 루프의 각 반복은 내부적으로 별도의 워크플로우 인스턴스로 처리됨
    • foreach 정의 블록 안의 step 실행, 즉 sub-graph 실행은 별도의 워크플로우 인스턴스에 위임됨
    • foreach step은 각 반복을 담당하는 워크플로우 인스턴스 상태를 모니터링하고 수집함
    • 반복별로 다른 파라미터로 같은 작업을 실행하는 데이터 백필이나 머신러닝 모델 튜닝에 자주 사용됨
    • 사용자가 수십만 개 반복을 워크플로우 정의에 직접 작성하지 않아도 되며, foreach 범위가 바뀔 때 새 워크플로우를 만들 필요도 줄어듦
  • Conditional Branch

    • 조건 분기는 업스트림 step의 특정 조건이 충족될 때만 이후 step을 실행하게 함
    • 조건은 SEL 표현식으로 정의되고 런타임에 평가됨
    • 감사 체크 step이 실패했을 때 복구 작업을 수행한 뒤 다시 작업을 실행하는 흐름을 구성할 수 있음
  • Subworkflow

    • subworkflow는 하나의 워크플로우 step이 다른 워크플로우를 실행하게 해 공통 기능을 여러 워크플로우에서 공유할 수 있게 함
    • “workflow as a function” 형태로 워크플로우 그래프를 구성할 수 있음
    • Netflix에서는 여러 팀이 제공하는 subworkflow를 조합해 수백 개 테이블의 데이터를 처리하는, 수백 개 subworkflow로 구성된 복잡한 워크플로우도 관찰됨
    • foreach, 조건 분기, subworkflow는 함께 조합할 수 있음
    • subworkflow 집합을 루프로 처리할 수 있음
    • 중첩 foreach 루프를 실행할 수 있음
    • 조건 분기와 subworkflow를 함께 사용해 오류를 처리하고 작업을 자동 재시도하는 자동 복구 워크플로우를 만들 수 있음

Step Runtime과 파라미터 병합

  • Maestro는 실행 시점의 작업을 설명하기 위해 step runtime을 사용함
  • step runtime 인터페이스는 두 가지 정보를 정의함
    • step 인스턴스의 실행 동작을 제어하는 기본 API 집합
    • step 런타임 상태와 실행 결과를 추적하는 단순 데이터 구조
  • Maestro는 foreach step runtime, subworkflow step runtime 같은 구현을 제공함
  • 각 구현은 start, execute, terminate 동작에 대한 자체 로직을 정의함
  • 런타임 상태는 step의 다음 상태 전이를 결정하고 실패 또는 종료 여부를 판단하는 데 사용됨
  • 실행 결과는 step 아티팩트와 step 실행 이력 타임라인을 담으며, 이후 step에서 접근할 수 있음
  • Step Parameter Merging

    • Maestro는 step 동작을 동적으로 제어하기 위해 runtime parameter와 tag 주입을 지원함
    • step parameter map은 처음에는 비어 있고, 다음 순서로 병합됨
    • Default General Parameters: workflow_instance_id, step_instance_uuid, step_attempt_id, step_id 같은 모든 step의 기본 파라미터이며 Maestro 내부 예약값으로 사용자가 전달할 수 없음
    • Injected Parameters: step runtime에서 동적으로 생성되는 파라미터이며, step 유형별 schema에 따라 달라질 수 있음
    • Default Typed Parameters: 특정 step 유형에 관련된 기본 파라미터로, foreach step의 loop_params, loop_index 등이 해당함
    • Workflow and Step Info Parameters: workflow_id 같은 step과 워크플로우 관련 식별 정보
    • Undefined New Parameters: 워크플로우 인스턴스 시작 또는 재시작 시 사용자가 새로 지정한 step 파라미터
    • Step Definition Parameters: 정의 시점에 사용자가 작성한 step 파라미터
    • Run and Restart Parameters: 시작 또는 재시작 시 사용자가 기존 정의 파라미터를 덮어쓰기 위해 제공한 값이며, 가장 마지막에 병합됨

Step Dependencies와 Signal

  • Maestro 워크플로우 그래프의 step은 step dependency로 실행 의존성을 표현할 수 있음
  • step dependency는 step 실행에 필요한 데이터 관련 조건을 지정함
  • 조건은 보통 signal을 기반으로 정의됨
  • signal은 파라미터 값 같은 정보를 담은 메시지이며, step 출력이나 SNS·Kafka 같은 외부 시스템을 통해 발행될 수 있음
  • signal은 trigger 패턴과 publisher-subscriber 형태의 signal dependency 패턴에 모두 사용됨
  • 하나의 step은 출력 signal을 발행해 해당 signal에 의존하는 여러 step의 실행을 풀 수 있음
  • signal definition은 매핑된 파라미터 목록을 포함하며, Maestro는 일부 필드만으로 signal matching을 수행할 수 있음
  • Maestro는 signal 파라미터 값에 대해 <, > 같은 signal operators를 지원함
  • Netflix는 signal 개념 위에 여러 추상화를 구축함
    • ETL 워크플로우가 테이블을 갱신하고 signal을 보내면, 해당 데이터에 의존하는 다운스트림 워크플로우 step이 실행될 수 있음
    • signal lineage는 과거 signal 인스턴스와 해당 signal을 발행하거나 소비한 워크플로우 step을 탐색할 수 있게 함
    • signal trigger는 하나 또는 조인된 signal 집합을 구독하는 워크플로우에 대해 exactly-once execution을 보장함
  • 지정된 signal 조건이 충족될 때만 워크플로우나 step을 실행하므로 리소스를 절약할 수 있음

디버깅과 실행 가시성

  • Breakpoint

    • Maestro는 워크플로우 step에 브레이크포인트를 설정할 수 있음
    • 워크플로우 인스턴스가 브레이크포인트가 걸린 step에 도달하면 해당 step은 paused 상태가 됨
    • 사용자가 수동으로 재개할 때까지 워크플로우 그래프 진행이 멈춤
    • 같은 워크플로우 step의 여러 인스턴스가 브레이크포인트에서 멈춘 경우, 하나를 재개해도 해당 인스턴스만 영향을 받고 나머지는 paused 상태로 유지됨
    • 브레이크포인트를 삭제하면 멈춰 있던 모든 step 인스턴스가 재개됨
    • 초기 워크플로우 개발 중 step 실행과 출력 데이터를 점검하는 데 유용함
    • foreach 패턴에서 단일 step에 브레이크포인트를 걸면 모든 반복이 해당 step에서 멈춰 디버깅할 수 있음
    • 실행 중 사람의 개입이나 실행 중 step 상태 변경 지원에도 사용할 수 있음
  • Timeline

    • Maestro는 step 실행 타임라인을 포함하며, 상태 머신 변경과 그 이유 같은 주요 이벤트를 기록함
    • 예시 이벤트에는 Created, Evaluating params 같은 전이가 포함됨
    • 구현된 step runtime은 최종 사용자에게 실행 정보를 보여주기 위해 타임라인 이벤트를 추가할 수 있음
    • 타임라인 예시는 sample-step-instance-failed.json에 있음

재시도, Aggregated View, Rollup

  • Retry Policies

    • Maestro는 실패로 종료 상태에 도달한 step에 대해 재시도 정책을 지원함
    • 사용자는 재시도 횟수, 재시도 간 지연, 고정 간격 재시도, exponential backoff 전략을 설정할 수 있음
    • 재시도는 두 유형으로 구분됨
    • platform retry: 사용자 로직과 무관한 플랫폼 수준 오류 대응
    • user retry: 사용자 정의 조건에 따른 재시도
    • 각 유형은 별도 재시도 정책을 가질 수 있음
    • 자동 재시도는 사용자 개입 없이 해결 가능한 일시적 오류 처리에 유용함
    • 멱등성이 없는 step은 재시도를 피하기 위해 재시도 횟수를 0으로 설정할 수 있음
  • Aggregated View

    • 하나의 workflow instance가 여러 run을 가질 수 있으므로, 사용자가 모든 step의 집계 상태를 볼 수 있어야 함
    • aggregated view는 기본 aggregated view와 현재 run의 step 상태를 병합해 계산됨
    • 예를 들어 첫 실행에서 step1·step2는 성공, step3는 실패, step4·step5는 시작 전인 경우 재시작은 step3부터 시작하고 step1·step2는 이전 성공 상태 때문에 skip될 수 있음
    • 모든 step이 성공하면 aggregated view는 전체 step의 run 상태를 보여줌
  • Rollup

    • rollup은 workflow instance의 상위 수준 요약을 제공하며, 각 step 상태와 상태별 step 수를 나타냄
    • 현재 인스턴스와 subworkflow·foreach 같은 중첩 non-inline workflow의 step을 펼쳐 집계함
    • 성공한 workflow가 세 step을 갖고, 그중 하나가 다섯 step짜리 subworkflow라면 rollup은 성공 step 수를 7개로 표시함
    • rollup에서는 leaf step만 집계하며, 다른 step은 구체적 워크플로우를 가리키는 포인터로 취급됨
    • 성공하지 않은 step의 참조도 보존해, 중첩 워크플로우 안의 문제 step으로 이동할 수 있게 함
    • aggregated rollup은 현재 run의 runtime data와 base rollup을 결합해 계산됨
    • subworkflow step의 rollup은 subworkflow instance의 rollup을 그대로 반영함
    • foreach step의 rollup은 이전 실행에서 재시작 대상 반복을 제외한 base rollup과 현재 실행 중 반복들의 rollup을 결합함
    • 이 과정 때문에 rollup 모델은 eventually consistent이며, 중첩 foreach와 subworkflow가 여러 단계로 들어가면 계산이 복잡하고 재귀적일 수 있음

이벤트 발행과 외부 연동

  • 워크플로우 정의, workflow instance, step instance가 변경되면 Maestro는 이벤트를 생성하고 내부 처리 후 외부 시스템에 발행함
  • Maestro 이벤트는 내부 이벤트와 외부 이벤트로 나뉨
    • internal event: workflow, workflow instance, step instance 수명주기 내부 변경을 추적하며 내부 큐에 발행됨
    • external event: 다운스트림 서비스가 소비할 Maestro 상태 변경 정보를 담아 SNS·Kafka 같은 외부 큐로 전송됨
  • Maestro event processor는 내부 큐를 구독해 internal event를 가져오고, 이벤트 유형에 따라 처리한 뒤 필요하면 external event로 변환함
  • 마지막 단계의 notification publisher가 외부 이벤트를 발행해 다운스트림 서비스가 소비할 수 있게 함
  • 다운스트림 서비스는 대부분 이벤트 기반이며, Maestro event는 Maestro의 다양한 변경을 감지하는 데 필요한 메시지를 담음
  • 변경 유형은 크게 두 범주로 나뉨
    • workflow change: 워크플로우 정의나 properties 변경 같은 워크플로우 수준 동작
    • instance status change: workflow instance 또는 step instance의 상태 전이

시작 방법

  • Maestro 코드는 github.com/Netflix/maestro에서 확인할 수 있음
  • 질문, 의견, 코멘트는 Maestro 저장소의 GitHub issue로 남길 수 있음
  • Netflix는 Maestro가 제공하는 확장성과 사용성이 Netflix 외부의 워크플로우 개발도 빠르게 할 수 있기를 기대함

댓글과 토론

Hacker News 의견들
  • 예전에는 이런 기업 기술 블로그와 내부 독점 시스템에 감탄했지만, 이제는 그렇지 않음. 코드는 부채이기 때문임
    cron/Celery/Airflow 같은 걸 다시 만들기보다, 유지보수와 개선 이력이 긴 기성 오픈소스를 쓰고 싶음. 누군가는 유지보수하고 버그를 고치고 기능을 추가해야 하니까. 물론 승진과 연봉/RSU 인상이 따라온다면 예외임
    회사에 돈을 벌어주는 핵심 업무가 아닌 코드는 주의를 분산시키고 자원을 잡아먹는 대상이라는 걸 깨달아야 함

    • 이 블로그 글이 바로 그래서 나온 것 아닌가 싶음. 이 소프트웨어를 오픈소스화해서 더는 전부 내부에서만 유지보수하지 않아도 되게 하려는 것임
      기존 기성 오픈소스가 해결하지 못한 필요가 있어서 만들었고, 이제 그것을 다시 기성 오픈소스로 바꿔 계속 쓰면서 유지보수 부담을 나누려는 과정임. 이런 도구가 처음부터 어떻게 생기겠나, 누군가는 만들어야 함
    • “코드는 부채”라는 관점은 너무 극단적이고, 세상의 모든 것을 MBA식으로 최소-최대화하려는 사고와 강하게 이어져 있음
      새로운 시스템을 만들고 새로운 아이디어를 밀어붙이는 걸 두려워하지 않는 사람들이 있어서 다행임. 기업 관점에서도 평범하고 위험 회피적인 해법만으로는 한계가 있음. 가장 수익성 높은 회사들은 기술적으로 꽤 대담한 편임
      코드는 부채가 아니라, 회사의 톱니바퀴를 돌리는 것임
    • 기성 오픈소스도 대기업이 내부 도구를 공개한 결과물인 경우가 많음. 직접 언급한 Airflow가 좋은 예이고, 이 영역에서는 Temporal도 마찬가지임. 누군가는 새것을 만들 만큼 “멍청해야” 함
    • “유지보수와 개선 이력이 길다”는 말은 엄청난 전제를 짊어지고 있음
      스스로 커뮤니티에 기여할 계획도 있는지 궁금함. 만들 것인지 살 것인지는 늘 중요한 논의지만, ‘사는’ 쪽에는 유지보수와 신뢰성 비용이 정확히 0이라고 보는 건 순진해 보임
    • “회사의 핵심 업무가 아닌 것”이라는 조건이 중요함. 성능이 중요한 영역의 숙련된 팀이라면, 외부 코드가 저품질/저통제 부채로 바뀌는 변곡점이 그리 멀지 않음
  • 엔지니어들이 워크플로 솔루션에 만족하려면 몇 번의 반복이 더 필요할지 궁금함. Netflix는 Maestro 이전에도 Metaflow 같은 여러 솔루션이 있었고, Uber도 여러 솔루션을 만들었으며, Amazon에는 내부 워크플로 엔진이 적어도 십여 개는 있었음
    여러 회사의 많은 개인이 워크플로 엔진을 만들고 싶어 한다는 점이 흥미로움. 누군가나 Netflix를 깎아내리려는 말은 아니고, 가볍게 이야기해볼 만한 관찰이라고 봄

    • 문제는 워크플로 오케스트레이션이 매우 넓은 문제 영역이라는 데 있음. 회사들은 서로 다른 여러 문제를 해결해야 해서, 어떤 솔루션이든 관련 기능이 많은 거대한 제품이 되고, 성장하면서 강한 철학을 가진 큰 단일체가 되기 쉬움. 그래서 거의 누구도 만족하지 못함
      실제로는 다섯 가지 핵심 관심사가 있음: 자원 스케줄링, 의존성 해결, 작업과 워크플로를 만들기 위한 API/DSL, cron 같은 예약 실행, 그리고 ETL이나 ML/AI 워크플로에서 도메인 정보를 드러내는 도메인 인식
      이 모든 걸 깔끔하게 해내는 단일 솔루션은 없음. 그래서 회사들은 기존 기성품의 단점을 메우려고 직접 만들거나 우회하게 되고, 모두가 계속 불만족하는 순환이 이어짐
      스타트업 하나가 “해결책”으로 만들어낼 수 있는 문제는 아니라고 봄. 좋은 플러그형 모듈 컴포넌트로 이뤄진 오픈소스 생태계로 풀어야 함
    • Metaflow는 Maestro 위에 올라가는 것이고, 둘 중 하나가 다른 하나를 대체하지 않음
      “Users can use Metaflow library to create workflows in Maestro to execute DAGs consisting of arbitrary Python code.”라고 https://netflixtechblog.com/orchestrating-data-ml-workflows-...에 나와 있음
      이 글의 오케스트레이션 섹션(https://netflixtechblog.com/supporting-diverse-ml-systems-at...)에는 Metaflow가 Maestro, Airflow, Argo Workflows, Step Functions와 어떻게 맞물리는지 자세히 설명되어 있음
    • 자체 워크플로 엔진을 만들었는데, 버그가 너무 많고 너무 유연하지 않아서 관련 없는 프로젝트 하나를 거의 망가뜨릴 뻔했음
      워크플로 엔진은 어느 정도 설계 냄새일 수 있다는 생각이 들기 시작함. 한 번 재사용 가능한 걸 만들면 수많은 워크플로에 쓸 수 있을 것처럼 매력적으로 보이지만, 비동기 단계가 둘 이상 필요하다는 것 말고는 워크플로들이 거의 공통점이 없음
      데이터도 다르고, API도 다르고, 계속 진행하기 위해 사용자나 다른 시스템에서 받아야 하는 피드백도 다름
    • 다양한 작업을 처리하면서도 이해하고 운영하기 쉬운 워크플로 엔진/오케스트레이터를 아직 찾지 못했기 때문일 가능성이 큼
      특정 사용 사례에 최적화된 맞춤형 워크플로 엔진을 만드는 건 정말 쉬움. 아직 수렴이 일어나지 않은 이유는 그런 도구가 아직 만들어지지 않았기 때문이라고 봄
      최근 각 영역을 빠르게 장악한 도구들을 보면 Terraform은 IaC, Kubernetes는 분산 컴퓨팅의 어려운 문제를 풀었음. 둘 다 매우 복잡하지만 어려운 문제를 해결함. 반면 범용 워크플로 엔진은 이해하기 복잡하고 운영하기 어렵고 경험도 애매해서, 많은 사람이 아예 시도하지 않음
    • 이름 짓기, 캐시 무효화, 그리고 워크플로 엔진인가? :)
      https://github.com/meirwah/awesome-workflow-engines
  • https://windmill.dev의 창업자인데, Windmill은 Maestro와 유사점이 많음
    Maestro 설명에서 “대규모 워크플로, 데이터 파이프라인, ML 모델 학습 파이프라인을 관리하는 범용 수평 확장 워크플로 오케스트레이터”라고 한 부분은 Windmill로 바꿔도 정확히 맞음. 그들이 말하는 rollup은 우리가 openflow state라고 부르는 것임
    주요 차이는 Windmill은 Java 대신 Rust로 작성됐고, Maestro는 상태 저장에 CockroachDB를 쓰지만 우리는 상태와 큐 모두 PostgreSQL을 씀. 다만 CockroachDB를 쓰는 이유는 이해됨. Windmill도 매우 큰 고객 인스턴스에서 수평 확장을 위해 자체 샤딩 알고리즘을 만들어야 했음
    Maestro는 Apache 2.0이고 Windmill은 덜 우호적인 AGPL임. Netflix의 지원을 받아 자금은 사실상 무한하지만, 우리는 수익을 내고 있어도 훨씬 작은 회사임
    Maestro는 Kubernetes나 docker-compose 기반 셀프호스팅 문서가 충분하지 않고, 무언가를 만들 UI가 없거나 문서에서 아직 잘 드러나지 않음. 그래도 전반적으로 오픈소스로 공개된 건 꽤 멋지고, 계속 지켜보며 가능한 빨리 벤치마크해볼 예정임

    • Windmill을 고려한다면 먼저 이것부터 봐야 함: https://www.windmill.dev/docs/advanced/local_development
      왜 Windmill과 “동기화”해야 하는지, 왜 Windmill 안에 IDE가 들어 있는지, 왜 이렇게 복잡한지 모르겠음. 좋은 제품을 만들거나 시장 적합성을 찾기도 전에 잠금 효과를 목표로 시작하는 것처럼 보임
    • 비교는 좋지만, Maestro가 Apache 라이선스여도 CockroachDB에 의존한다면 CockroachDB 자체가 오픈소스가 아니므로 별로 좋지 않음
      오픈소스가 아닌 의존성보다 AGPL 코드베이스가 차라리 낫다고 봄. 물론 시간이 지나면 누군가 대체 데이터베이스 지원을 추가할 수는 있음
  • 여기서 무슨 일이 벌어지는지 조금 혼란스러움. 이 프로젝트는 Netflix/conductor [0]를 쓰는 것처럼 보임. 그런데 그 저장소에 가보면 보관 처리되어 있고, Netflix의 내부 비오픈소스 버전과 언급되지 않은 커뮤니티 포크로 대체됐다는 메시지가 있음. 아마 Orkes Conductor [1]를 뜻하는 듯함
    그런데 이건 Orkes Conductor를 쓰지 않고, 중단된 Netflix 버전인 com.netflix.conductor:conductor-core:2.31.5 [2]를 쓰는 것처럼 보임. 그것도 오래된 버전임
    [0] https://github.com/Netflix/conductor
    [1] https://github.com/conductor-oss/conductor
    [2] https://github.com/Netflix/maestro/blob/e8bee3f1625d3f31d84d...

  • ActiveBatch를 써본 사람이 있는지 궁금함. 내게는 비기업 사용자용 동등한 제품이 있었으면 하는 최고의 소프트웨어임
    다른 “경쟁 제품”을 계속 써보려 했지만, ActiveBatch는 단순한 MS SQL DB를 붙이고 Windows GUI와 실행 에이전트를 설치하면 클릭 몇 번으로 탄탄한 GUI 기반 자동화 환경이 생김. 코드를 쓰지 않아도 되고, 원하면 어떤 언어로든 코드를 쓸 수도 있음
    Airflow는 강력할 수 있지만, 복잡성 장벽 뒤에 숨어 있어서 진짜 역량이 무엇이든 대부분은 보지 못함. 다른 “오픈소스” 경쟁 제품도 마찬가지임
    왜 누군가 견고한 DB 기반 GUI 우선 시스템을 만들지 못하는지 모르겠음. 온라인 서비스도 써봤지만 비교가 안 됨. 더 단순한 유료 제품이 실패하는 이유는 확장 기능 유지 비용 때문일지도 모르겠음
    ActiveBatch가 어리석은 기업 영업 모델 뒤에 갇혀 있는 건 정말 아쉬움. 이 훌륭한 소프트웨어가 더 넓은 커뮤니티에 퍼지는 걸 막고 있음. 숨겨진 비밀 같음

  • 조언하자면, Netflix가 오픈소스로 공개한 도구에는 의존하지 않는 편이 좋음. 발표한 뒤 지원을 중단한 전례가 길게 있음
    누군가는 이 블로그 글과 코드 공개로 승진 평가표에 체크 표시를 얻었겠지만, 이런 솔루션 위에 비즈니스를 세우지는 말아야 함

  • Temporal처럼 더 자리 잡은 것 대신 왜 이걸 고려해야 하는지 모르겠음. Maestro는 Java로 작성됐고, Temporal은 Go로 작성된 것으로 보임

    • Temporal의 Go 코드는 좀 묘함. 예전에는 Java를 썼던 것 같은데 Go로 바꿨고, 그 Go가 매우 Java스럽게 보임
      아니면 내가 Fx를 잘 모르는 걸 수도 있음
      https://github.com/temporalio/temporal/blob/main/service/mat...
      Temporal에서 반복해서 부딪힌 문제는 문서가 매우 부족하다는 점임. 비즈니스 핵심에 설치하는 물건인데, 여러 계층과 매우 난해한 문서를 지나 실제로 무슨 일이 벌어지는지 이해하기가 정말 어려움
      Maestro는 문서가 없는 것 같음. 그렇다면 Temporal이 기본 승리임
    • Netflix도 Temporal을 사용함: https://temporal.io/in-use/netflix
    • Maestro는 Temporal의 대안이 아니라 Airflow의 대안 아닌가 싶음. Temporal은 워크플로 오케스트레이터가 아님. 내부 구조에는 겹치는 부분이 있지만, 서로 다른 사용 사례를 위한 다른 설계임
    • Temporal의 핵심 일부를 Rust로 다시 작성하지 않았나?
  • 정말 좋아 보이는 프로젝트임. 내가 맡았던 거의 모든 ML + 데이터 엔지니어링 혼합 프로젝트에서 이와 거의 같은 것의, 아마 더 나쁜 버전을 만들까 고민한 적이 있음
    직접 테스트해보는 게 기대됨

  • 이 영역에서 orchestra를 만들고 있어서 내 생각을 적어보면, 오픈소스로 만들고 공개적으로 개발하는 건 분명 훌륭함. 하지만 이건 스스로도 말하듯 오케스트레이터이고, 이미 Airflow 등을 비롯해 앞서 나온 것이 너무 많음
    그래서 상업 환경에서 아무도 쓰지 않을 또 하나의 선택지를 더하는 것 말고, 이 영역에 실제로 무엇을 더하는지 보기 어렵다
    뻔뻔한 홍보: https://getorchestra.io

  • 이게 예전에 보관 처리된 Conductor와 의미 있게 다른지 궁금함. 코드를 훑어보니 유사점이 꽤 보이고, 워크플로 정의 언어로 JSON을 쓰는 점도 같음