[DATA-010][실무] 배치와 스트리밍으로 이벤트 처리하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[DATA-010][실무] 배치와 스트리밍으로 이벤트 처리하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 118회 작성일 26-09-05 03:34

본문

[이번 수업]
쌓인 데이터를 한꺼번에 처리하는 배치와 도착하는 이벤트를 계속 처리하는 스트리밍을 비교합니다. 시간 구간 집계와 중복 방지까지 로컬에서 연습합니다.

[선수지식]
CSV·JSON, 데이터 파이프라인, 평균과 집계를 알아야 합니다. 이벤트는 주문 생성이나 센서 측정처럼 특정 시점에 일어난 사실을 나타내는 데이터입니다.

[학습목표]
- 지연 요구에 따라 배치와 스트리밍을 선택합니다.
- 이벤트 시간과 처리 시간을 구분합니다.
- 재시도에도 결과가 중복되지 않게 설계합니다.

[핵심개념]
배치는 하루치 파일처럼 끝이 있는 데이터 묶음을 정해진 시각에 처리합니다. 구현과 재실행이 비교적 단순하고 큰 집계에 효율적이지만 결과가 다음 실행까지 늦어집니다. 스트리밍은 끝없이 들어오는 이벤트를 계속 또는 짧은 간격으로 처리해 빠른 결과를 만듭니다. 대신 순서 변경, 늦은 도착, 중복, 장애 복구를 다뤄야 합니다. 수분 안의 결과가 필요한지, 하루 한 번이면 되는지부터 결정합니다.

이벤트 시간은 사건이 실제로 발생한 시각이고 처리 시간은 시스템이 이벤트를 읽은 시각입니다. 네트워크 지연 때문에 둘은 다를 수 있습니다. 분·시간 같은 창(window)으로 이벤트 시간을 묶어 집계합니다. 워터마크는 특정 시각까지 데이터가 대체로 도착했다고 판단하는 진행 기준입니다. 늦은 데이터의 허용 시간과 창을 다시 계산할지, 별도 보정할지를 정해야 합니다.

전달 방식도 중요합니다. at-most-once는 유실 가능성 대신 중복을 줄이고, at-least-once는 재시도로 유실을 줄이는 대신 중복될 수 있습니다. exactly-once라는 표현도 원본 읽기부터 상태와 출력 저장까지 지원 범위를 확인해야 합니다. 실무에서는 이벤트 ID를 저장하고 같은 ID를 다시 받아도 결과가 한 번만 바뀌는 멱등성, 즉 여러 번 실행해도 효과가 같은 성질을 함께 적용합니다. 원본은 재처리할 수 있게 보존하고 실패 이벤트는 별도 경로로 격리합니다.

[따라하기]
가상 이벤트를 1분 창으로 합치고 중복 ID를 제외합니다. window.py로 저장하세요.

```python
from collections import defaultdict
from datetime import datetime

events = [
    {"id": "e1", "time": "2026-09-05T10:00:05Z", "value": 2},
    {"id": "e2", "time": "2026-09-05T10:00:50Z", "value": 3},
    {"id": "e2", "time": "2026-09-05T10:00:50Z", "value": 3},
    {"id": "e3", "time": "2026-09-05T10:01:10Z", "value": 4},
]
seen = set()
totals = defaultdict(int)
duplicates = 0
for event in events:
    if event["id"] in seen:
        duplicates += 1
        continue
    seen.add(event["id"])
    moment = datetime.strptime(event["time"], "%Y-%m-%dT%H:%M:%SZ")
    window = moment.strftime("%Y-%m-%dT%H:%MZ")
    totals[window] += event["value"]
for window, total in sorted(totals.items()):
    print(window, total)
print("duplicates=", duplicates)
```

macOS/Linux는 `python3 window.py`, Windows PowerShell은 `py window.py`로 실행합니다. 예상 결과입니다.

```text
2026-09-05T10:00Z 5
2026-09-05T10:01Z 4
duplicates= 1
```

e2가 두 번 와도 한 번만 더해집니다. 실제 파이프라인에서는 seen 집합을 메모리가 아닌 내구성 있는 상태 저장소에 두고 보존 기간을 정합니다. 이벤트 시간은 UTC로 통일하고 원본 시간대도 필요하면 별도 필드에 남깁니다.

[흔한 실수]
빠르다는 이유만으로 스트리밍을 선택하거나 처리 시간을 사건 시각으로 착각하기 쉽습니다. 중복 제거 키 없이 금액·재고를 누적하지 않습니다. 재처리 전 출력 덮어쓰기와 외부 부작용도 확인합니다.

[보안 주의]
이벤트에는 필요한 필드만 담고 비밀번호·토큰·불필요한 개인정보를 넣지 않습니다. 전송과 저장을 암호화하고 생산자·소비자 권한을 분리합니다. 실패 이벤트 저장소도 접근과 보존 기간을 제한합니다. 실습은 가짜 데이터가 있는 로컬·격리 환경에서만 진행합니다.

[직접 해볼 과제]
e4를 10:01 창에 추가하고 e1 중복도 하나 넣으세요. 예상 합계와 중복 수를 먼저 적은 뒤 실행 결과와 비교하세요.

[확인문제]
1. 배치와 스트리밍을 선택할 때 가장 먼저 확인할 요구는 무엇인가요?
2. 이벤트 시간과 처리 시간이 달라지는 이유는 무엇인가요?
3. at-least-once 처리에서 멱등성이 필요한 이유는 무엇인가요?

[다음 학습]
SWE-010에서는 확장성·일관성·가용성의 선택을 배웁니다. DATA-011에서는 데이터 품질·계보·거버넌스·개인정보를 다룹니다.

[공식 참고 자료]
- Apache Beam 프로그래밍 가이드: https://beam.apache.org/documentation/programming-guide/
- 이벤트 전달 의미: https://kafka.apache.org/documentation/#semantics
- CloudEvents 명세: https://github.com/cloudevents/spec/blob/main/cloudevents/spec.md
- 이벤트 시간과 워터마크: https://nightlies.apache.org/flink/flink-docs-stable/docs/concepts/time/

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
1,047
어제
5,103
최대
16,772
전체
772,101
Copyright © 소유하신 도메인. All rights reserved.