Google Cloud에서 Event-Driven Architecture 재정의
Source: Dev.to
Cloud Run, Pub/Sub, Eventarc를 사용한 이벤트‑드리븐 시스템 구축은 강력한 패턴이지만, “Hello World” 튜토리얼과 실제 운영 안정성 사이의 격차는 큽니다. 이것은 Google Cloud 서버리스 아키텍처 현장에서 얻은 힘든 교훈들입니다.
Eventarc와 Direct Pub/Sub 선택하기
| Feature | Eventarc | Direct Pub/Sub |
|---|---|---|
| Best For | GCP‑native events (GCS, Firestore, Audit Logs) | Custom inter‑service messaging |
| Setup | Managed wrapper, high convenience | Manual configuration, high control |
| Filtering | Built‑in attribute filtering | Fine‑grained policies & custom attributes |
| IAM | Uses eventarc.eventReceiver | Uses pubsub.subscriber |
Pro Tip: Use Eventarc for “plumbing” Google Cloud events. Use Direct Pub/Sub when you need a custom event bus or specific retry/ordering logic.
전달 보장 및 멱등성
- Pub/Sub는 기본적으로 최소 한 번 전달을 보장합니다.
- 정확히 한 번 전달은 선택적 기능으로 제공되지만, 소비자는 여전히 중복이 발생할 수 있다고 가정해야 합니다.
- 핸들러가 멱등성이 없으면 사용자에게 중복 청구를 하거나 상태를 손상시킬 위험이 있습니다.
절대적인 멱등성 흐름
- 이벤트에서 고유한 멱등성 키(UUID/해시)를 추출합니다.
- 빠른 접근 캐시(Memorystore 또는 Firestore)에서 해당 키를 확인합니다.
- 키가 존재하면 메시지를 중복으로 간주하고 폐기합니다.
- 키가 없으면 이벤트를 처리하고 TTL과 함께 키를 저장합니다.
콜드 스타트 및 지연
- Cloud Run의 “scale to zero”는 비용을 절감하지만 첫 번째 요청에서 2–8 seconds의 지연을 추가합니다.
- Fix: 지연에 민감한 경로에
min‑instances를 설정합니다(비용 발생). - Alternative: 시작 시간 오버헤드가 덜 중요한 비동기 배치 처리에는 Cloud Run Jobs를 사용합니다.
Deployment Considerations
- When deploying Eventarc triggers via Terraform or CLI, filtering rules can take 60–120 seconds to propagate across the Google network.
- Production Fix: Build a “warm‑up” delay into your CI/CD pipeline. Do not trigger integration tests immediately after a successful deployment, or you will see intermittent, false‑positive failures.
규모에 따른 비용
| 구성 요소 | 예상 비용 |
|---|---|
| Pub/Sub (수집 + 전송) | 0.286 TiB × $40 × 2 ≈ $23/월 |
| Cloud Run (3 억 호출, 1 초, 512 MiB) | $150–$200/월 |
| 총계 | ≈ $175–$225/월 |
가정: 일일 1,000만 이벤트 (≈ 월 3억), 최소 메시지 크기 1 KB, 실행 시간 1 초, 512 MiB RAM. 메시지 크기와 호출 지속 시간을 모니터링하면 비용을 예측 가능하게 유지할 수 있습니다.
지역 매핑 및 아웃바운드
- Eventarc 트리거는 다중 지역 서비스(예: Firestore
nam5)에 대해 종종 특정 지역(예:us-central1)에 고정됩니다. - Cloud Run 서비스가 다른 지역에 있으면 교차 지역 아웃바운드 요금이 발생하고 지연 시간이 증가합니다.
- GCP 문서에 있는 지역 매핑 표를 항상 확인하세요.
고급 Eventarc: CEL 변환
Eventarc Advanced를 사용하면 **Common Expression Language (CEL)**을 이용해 페이로드가 소비자에게 도달하기 전에 변환하거나 민감 정보를 삭제할 수 있습니다—PII 준수를 위해 필수적입니다.
// Example: Redacting an email address in‑flight
message.setField("data.email",
re.extract(message.data.email, "(^.).*@(.*)", "\\1***@\\2"));
Reliability Patterns
- Dead‑Letter Topics (DLTs): 모든 구독에는 데드레터 토픽이 있어야 합니다.
- Alerting:
subscription/dead_letter_message_count메트릭을 모니터링하세요; 증가하는 카운트는 로직 버그나 스키마 불일치를 나타냅니다. - Tracing: OpenTelemetry를 사용해 Trace ID를 이벤트 속성에 주입하면, 프로듀서에서 버스를 거쳐 컨슈머 로그까지 단일 요청을 추적할 수 있습니다.
이 아키텍처를 사용하면 안 되는 경우
Eventarc + Cloud Run을 건너뛰세요 if:
- 강한 일관성과 즉시 트랜잭션이 필요할 때.
- 엔드‑투‑엔드 지연 요구사항이 100 ms 미만일 때.
- 분산 추적 디버깅의 오버헤드가 확장성 이점을 능가할 때.
이러한 경우, 구조화된 오케스트레이션을 위해 동기식 gRPC/HTTP 또는 Cloud Workflows를 고려하세요.
결론
Cloud Run와 Eventarc의 조합은 2026년에도 가장 견고한 패턴 중 하나입니다. 플랫폼 경계를 존중하고—전파 지연을 고려하며, 멱등성을 보장하고, 지역을 공동 배치함으로써—시스템을 제로에서 수백만 개의 이벤트까지 손쉽게 확장할 수 있습니다.