AppDev 알아보기 #1 EventArc를 이용한 EDA 구축
조대협 (http://bcho.tistory.com)
넷플릭스의 레퍼런스 아키텍쳐로 유명한 EDA (Event Driven Architecture)등은 구축하기 위해서, 이벤트 버스, 비동기큐, 워크플로우 엔진등 여러가지 복잡한 컴포넌트가 필요하고 이를 위한 운영이 어렵기 때문에 일반적인 오픈소스로 구축하기에는 부담이 많이 된다.
클라우드에서 이러한 EDA 아키텍처를 구축하기 위해서 핵심 컴포넌트들을 매니지드 서비스 형태로 제공하고 있다. 이 글에서는 구글 클라우드에서 EDA를 구축하기 위한 핵심 컴포넌트들에 대해서 알아보도록 한다.
CloudScheduler
CloudScheduler는 GCP 기반의 Cron이라고 생각하면 된다.
스켈된 일정에 따라서, 이벤트를 다음과 같은 Endpoint에 전달할 수 있다.
- HTTP 엔드포인트
- Pub/Sub
- App Engine 엔드포인트
일반적인 Cron Job에 비해서 다를 것은 없지만 다음 내용은 주의해야 한다.
- 이벤트 전달이 실패한 경우 다시 Retry를 한다. Retry수는 retryCount라는 Configuration 값으로 지정이 가능하고 Default는 0이다.
- At Least once delivery를 사용한다. 최소한 한번은 이벤트를 전달한다는 이야기인데, 이는 바꿔 말하면 같은 이벤트를 2번 이상 전달할 수 있기 때문에 중복 호출이 발생할 수 있다.
Eventarc
Eventarc 은 외부 이벤트 이벤트 소스로 부터 이벤트를 받아와서, 이벤트 Consumer에 이를 전달하는 역할을 한다.
간단한 유스케이스를 생각해보면, GCS 버킷에 파일이 업로드 되면, 이 이벤트를 CloudRun이나 Cloud Function에 전달하는 등의 역할을 한다.
Eventarc은
- 이벤트 수집
- 그리고 수집된 이벤트를 목표에 전달
하는 두 가지 기능을 하고 있고, 수집된 이벤트를 목표에 전달하기 위해서 비동기 메커니즘을 이용하기 위해 내부적으로 Pub/Sub을 사용한다.
Eventarc에 의해서 생성된 Event 메시지 예제를 보면, GCS 버킷 “my-event-source-bucket”에 image/jpeg 타입의 파일 “/path/to/my-new-file.jpg”가 2025-10-30 에 생성된 이벤트가 발생한것을 볼 수 있다.
{
"data": {
// 이벤트 유형에 따라 달라지는 실제 데이터 페이로드
"bucket": "my-event-source-bucket",
"contentType": "image/jpeg",
"name": "path/to/my-new-file.jpg",
"size": "102400",
"timeCreated": "2025-10-30T10:00:00.000Z",
"crc32c": "xyz123abc"
},
"datacontenttype": "application/json",
"id": "a-unique-event-id-12345",
"source": "//storage.googleapis.com/projects/_/buckets/my-event-source-bucket",
"specversion": "1.0",
"type": "google.cloud.storage.object.v1.finalized",
"time": "2025-10-30T10:00:00.000Z",
"subject": "objects/path/to/my-new-file.jpg"
}
그러면 이 이벤트를 CloudRun 등에서 받아서, 해당 파일에 대한 후속 처리등을 할 수 있게 된다.
이벤트 발생을 수집하는 데에는 두가지 개념이 사용되는데, Trigger와, Channel이다.
Trigger
Trigger는 이벤트 발생 소스 (GCS,PubSub), 이벤트 유형 (파일 생성, 메시지 게시), 이벤트 전달 대상 (CloudRun,Workflow등)으로 구성되며, 이 조건에 맞는 이벤트를 전달대상에 전달하는 설정이다
아래는 이해를 돕기 위해서 GCP 콘솔에서 Trigger를 등록하는 화면인데, Google Cloud Storage에서 Object가 create되면 이벤트를 json 타입으로 생성하도록 하였고, Resource 타입을 Any Resource로 하였기 때문에, 모든 GCS 버킷내에 생성되는 파일에 대해서 이벤트가 발생이 되는데, 필요하다면, Specific resource 를 이용해서 특정 Bucket을 지정하거나 Path Pattern등을 이용하여 파일명 규칙에 맞는 파일만 이벤트를 생성하도록 할 수 있다.
다음으로 Destination은 CloudRun의 function-1이라는 서비스의 “/” URL을 호출하도록 하였다.

Channel
채널은 주로 Custom 이벤트 소스나 서드 파티 이벤트 소스를 지원하기 위한 용도로, 외부 이벤트 제공자로 부터 이벤트를 받아서 Trigger로 전달하는 역할을 한다.
주로 미리 정의되지 않거나 GCP에서 기본으로 지원되지 않는 외부 이벤트 소스를 연동하는데 사용한데, 예를 들어 DataDog와 같은 모니터링 도구에서 이벤트를 수집한 후에, 이를 Trigger로 전달하는 역할로 사용할 수 있다.
Eventarc Advanced
Eventarc은 단순한 메시지 전달 기능 이외에, EDA의 핵심요소인 Event Bus 기능을 Eventarc Advanced 버전에서 제공한다.
트리거는 특정 이벤트만 수집한다고 하면, Bus는 일단 모든 이벤트를 수집한후, 조건에 따라서 그 이벤트를 알맞은 Destination으로 Routing을 한다. 그리고, 라우팅 된 메시지는 최종 Destination 에 도착하기 전에 메시지 포맷 변환 (예를 들어 JSON to Avro)나, 메시지 내용등의 변환을 수행할 수 있다.
트리거가 하나의 이벤트만 다룬다고 보면, Bus는 모든 이벤트를 중앙 집중화된 Bus구조에서 다루는 구조라고 볼 수 있다.
이 Bus 아키텍처를 이해하기 위해서는 Bus, Enrollment, Pipeline의 개념을 이해할 필요가 있다.

<그림. Bus, Enrollment, Pipeline 의 개념>
출처 : https://docs.cloud.google.com/eventarc/advanced/docs/overview
- Bus : Bus는 모든 이벤트가 수집되는 곳이다.
- Enrollment : 등록이라는 과정으로, 이벤트를 받을 Destination을 연결하기 위한 중간 브릿지와 같은 단계로 보면된다. Enrollment 등록을 통해서 어떤 이벤트를 받을지를 정의한다.
- Pipeline : Enrollment를 통해서 조건에 맞는 이벤트가 들어왔을때, 최종 Destination으로 전달하기 전에 메시지에 대한 Transformation (포맷 변환, 메시지 변환)을 수행한다. 이때 메시지 변환은 CEL 언어를 이용하여 세부 변환을 수행할 수 있다.
이 구조로 인하여 Bus가 가지는 추가적인 기능은 다음과 같다.
- 1:N : 트리거는 하나의 이벤트 종류를 하나의 Destination에 보낼 수 있지만, Bus 구조에서는 같은 이벤트에 대해서 다수의 Enrollment를 설정함으로써 1:N 구조로 다수의 Destination으로 메시지를 보내는 것이 가능하다.
- Routing : 메시지의 포맷이나 내용에 따라서 CEL을 통해 메시지를 필터링함으로써, 메시지를 다양한 Destination으로 라우팅이 가능하다.
- Transformation : Pipeline내에서 메시지에 대한 변환이 가능하다.
Destination
EventArc에서 사용할 수 있는 Destination으로는 다음과 같다.
- CloudRun : 일반적인 API 서버로 처리
- HTTP Custom Endpoint : 커스텀 애플리케이션과 연결. BigQuery도 HTTP Endpoint를 통해 BigQuery API URL을 지정하면 가능하다.
- Pub/Sub : 다른 메시지 큐로 연동하기 위함
- Workflow : Long running 워크플로우 (cf. BPM - Business Process Management)
'클라우드 컴퓨팅 & NoSQL > 분산컴퓨팅&클라우드' 카테고리의 다른 글
| 구글 클라우드-AppDev 알아보기 #2 CloudTask 를 이용한 Advanced Message (0) | 2025.10.31 |
|---|---|
| 분산 코디네이터 Zookeeper(주키퍼) 소개 (0) | 2015.04.12 |
| 분산 대용량 큐-Apache Kafka에 대한 검토 (0) | 2015.01.29 |
| Thrift, Avro and Protocol Buffers (0) | 2014.10.01 |
| 임시 파일 작업 공간 (Working storage)에 대한 노트 (1) | 2014.10.01 |