Database/MongoDB

[MongoDB] 2-1. Change Streams

noahkim_ 2025. 8. 10. 11:55

0. Change Streams

  • 애플리케이션이 실시간 데이터 변경 내용을 바로 받아볼 수 있게 하는 기능
  •  Aggregation Framework 기반 (변경 이벤트를 Aggregation 파이프라인으로 처리)
  • ✅ 단일 컬렉션, 데이터베이스, 전체 클러스터 대상

 

1. Availability

  • Replica Set Protocol Version 1 (pv1) 사용
  • Replica Set 및 Sharded Cluster + WiredTiger 스토리지 엔진 환경
  •  majority read concern 여부 관계없이 사용 가능
  • ✅ 암호화 가능

 

2. Watch

  • 클라이언트에서 change stream을 구독하기
  •  구독자 내부에서 대상 컬렉션에 대한 change stream이 생성됨

 

대상

대상 설명 제외되는 대상 관련 메서드 예시
Collection 단일 컬렉션 변경 사항 감시 시스템 컬렉션
admin, local, config DB
db.collection.watch()
Database 단일 DB의 비시스템 컬렉션 감시 admin, local, config DB db.watch()
Deployment Replica Set 또는 Sharded Cluster 대상
모든 DB의 비시스템 컬렉션 감시
admin, local, config DB Mongo.watch()

 

3. Connect

  • 클라이언트가 change stream를 구독하는 방식
  • ✅ mongodb 스레드가 oplog를 모니터링함 (커서 기반)
  • ➡️ 커서 조건에 맞는 이벤트 발생 시, 클라이언트에 변경 이벤트를 내려줌

 

연결 방식

연결 방식 예시 특징 사용 예
DNS Seed List 방식 mongodb+srv://<cluster-url>/ DNS로 노드 목록 자동 조회 MongoDB Atlas 등
서버 개별 나열 방식 mongodb://host1:27017,host2:27017,host3:27017 각 서버 주소를 한번에 나열
 

 

Failover

  • MongoDB 서버와 지속연결을 유지하여 실시간으로 변경 이벤트를 받음
  • ✅ 외부 요인에 의해 연결이 끊기면 자동으로 재연결을 시도함
  • 대상: 같은 read prefreence를 가진 다른 replica 노드
  • ⚠️ 적절한 노드를 찾지 못하면 예외 발생

 

4. Performance Consideration

Connection Pool

  • Change Stream: 연결 1개 + getMore() 요청 유지
  • 열린 Change Stream 수가 connection pool 크기를 초과하면 지연 발생
  • ➡️ maxPoolSize 값을 열린 Change Stream 수보다 크게 설정

 

Sharded Cluster에서의 동작

  • 각 샤드별로 Change Stream 생성
  • mongos는 각 샤드에서 Change Stream 이벤트를 정렬 및 필터링함

 

옵션
옵션 설명 비고
fullDocument 변경 이벤트에서 변경된 문서 전체를 포함할지 여부
updateLookup 설정 시 컬렉션에서 다시 조회
fullDocumentBeforeChange 변경 전 문서의 전체 내용을 포함할지 여부
changeStreamPreAndPostImages 기능 활성화 필요
resumeAfter 이전에 받은 Change Stream 이벤트의 _id를 지정해 중단한 지점부터 재개
Change Stream 재시작 시 사용
startAfter 특정 resume token 이후 이벤트부터 시작
resumeAfter와 유사하나, 해당 이벤트는 포함 안 함
startAtOperationTime 특정 시점의 operationTime 이후 이벤트부터 시작
클러스터 타임 기준
batchSize 한 번에 반환할 최대 이벤트 수
기본값은 드라이버별 상이
maxAwaitTimeMS 서버가 다음 이벤트를 기다리는 최대 시간(ms)
이 시간이 지나면 빈 결과 반환
collation 문자열 비교 방식 지정
다국어/대소문자 구분 처리 시 사용
showExpandedEvents 내부 이벤트까지 포함
(예: createIndexes, dropIndexes 등)
Stable API V1에는 포함 안 됨

 

Open A Change Stream

Modify Change Stream Output

Lookup Full Document for Update Operation

Resume a Change Stream

Use Cases

Access Control

Event Notification

Collation

Change Stream and Orphan Documents

Change Stream with Document Pre- and Post- Images

 

출처