본문 바로가기
카테고리 없음

장기 비동기 배치 워크플로우 추적 시스템

by frontier12 2025. 5. 28.


GitHub Actions + Temporal + Slack + Datadog으

🎯 왜 복잡한 비동기 배치 플로우가 문제인가?

마이크로서비스 기반 아키텍처에서는 다음과 같은 복잡한 장기 작업이 자주 등장합니다:
• 사후 데이터 정산 (예: 이커머스 정산, 포인트 소급, 거래 내역 정리)
• 외부 API polling or crawling (예: 외부 ERP 연동)
• 비동기 ML 학습 파이프라인, 대용량 PDF 병합·압축

이러한 작업은 다음과 같은 한계를 갖습니다:

기존 방식 한계점
GitHub Actions 단독 사용 6시간 타임아웃, 스텝 간 상태 공유 어려움
CronJob + DB poll 상태 추적 어려움, 장애 발생 시 복구 어려움
Kafka 기반 처리 장애 복구 및 로깅 체계 직접 구현 필요




🧠 해결책: Temporal 기반 분산 워크플로우 + GitHub Actions + Datadog + Slack 알림

Temporal이란?

Temporal은 Netflix에서 시작된 분산 워크플로우 오케스트레이션 프레임워크입니다.
특징:
• 비동기, 장기 실행, 실패 복구 자동화
• step 별 상태 관리, 재시도, 롤백, 타임아웃 설정 가능
• 고가용 아키텍처 기반: 실패 시에도 중단 없이 복구
• 다양한 언어 SDK 지원: Go, TypeScript, Java 등



📐 아키텍처 구성

GitHub Actions (trigger) ─┐
                         ▼
                  Temporal Workflow
     ┌──────────────┴──────────────┐
Step 1: API Fetch       Step 2: 데이터 변환
Step 3: 파일 병합       Step 4: Slack + Datadog 리포팅
     └─────────────────────────────┘

↔ Datadog Trace (step별 duration, failure 로그)
↔ Slack 알림 (완료/실패 요약 리포트)




⚙️ GitHub Actions → Temporal Trigger 예시

jobs:
  trigger-workflow:
    runs-on: ubuntu-latest
    steps:
      - name: Trigger Temporal Batch Job
        run: |
          curl -X POST https://temporal.mycompany.com/api/v1/workflows/start \
            -H "Authorization: Bearer ${{ secrets.TEMPORAL_API_KEY }}" \
            -d '{"workflowType": "BatchReconcile", "input": {"date": "2024-05-01"}}'




🧬 Temporal 워크플로우 예시 (TypeScript SDK)

import { proxyActivities, defineSignal } from '@temporalio/workflow';
const { fetchAPI, mergeFiles, postToSlack } = proxyActivities({...});

export async function BatchReconcileWorkflow(date: string) {
  const data = await fetchAPI(date);
  const merged = await mergeFiles(data);
  await postToSlack(`✅ Batch complete for ${date}`);
}

모든 step은 자동 재시도, 실패 시 resume 가능
Slack 메시지 또는 Datadog custom metric으로 각 step 추적 가능



📊 Datadog 통합
• Temporal SDK 내에서 datadog-metrics 라이브러리 호출
• 워크플로우 실행 시간, 실패율, 대기 시간 수집
• GitHub Actions에서 직접 dd-trace 연동 가능



🔔 Slack 리포팅 구조

await postToSlack(`
📦 *Batch 완료*
• 날짜: ${date}
• 처리건수: ${merged.count}
• Duration: ${elapsed} sec
`);

또는 GitHub Actions 실패 시 아래처럼 Alert 전송

- name: Slack 알림
  if: failure()
  uses: rtCamp/action-slack-notify@v2
  with:
    status: failure
    message: '❌ GitHub Workflow Failed - Batch Job'




🧩 결론: 단기 CI/CD → 장기 운영 자동화의 확장

이 구조는 단순한 CI/CD를 넘어 운영·정산·데이터 파이프라인까지 통제 가능한 형태로 확장합니다.

이전 방식 전환 후
복잡한 배치 파이썬 스크립트 워크플로우 오케스트레이션
일회성 스크립트 실행 GitHub Actions 트리거화
장애 시 수동 확인 자동 retry + 알림 + 트레이싱

Temporal은 단순한 워크플로우 엔진이 아닌
“장기 상태 보존 + 복구 + 확장”이 가능한 운영 자동화 플랫폼입니다.