스트리밍
스트리밍이란 무엇입니까
스트리밍은 최소한의 지연과 주가 정확하다는 보장으로 끝없는 일련의 이벤트 (트랜잭션 로그, 클릭, 지불, 원격 측정) 에 대한 지속적인 반응입니다. "우리는 기간 동안 누적 된 모든 것을 취합니다" 배치와 달리 스트림은 데이터가 도착할 때 데이터를 처리하고 상태를 유지하며 이벤트 시간을 고려합니다.
핵심 개념
이벤트는 '이벤트 _ time' 과 고유 한 '이벤트 _ id' 의 불변의 사실입니다.
이벤트 시간 대 처리 시간-첫 번째는 소스에서, 두 번째는 운영자가 실제로 이벤트를 보았을 때입니다.
- 텀블링, 호핑/슬라이딩, 세션.
- 워터 마크-" T 이전의 이벤트가 이미 도착했습니다 "라는 평가를 통해 창문을 닫고 늦은 데이터 대기를 제한 할 수 있습니다.
- Lateness - 현재 워터 마크보다 '이벤트 _ time' 이 적은 이벤트; 마무리 규칙이 종종 적용됩니다.
- 상태-집계, 결합, 중복에 대한 로컬 테이블/키 상태.
- 역압-다운 스트림 처리량을 초과 할 때의 압력; 프로토콜과 버퍼로 제어됩니다.
건축 기초
1. 출처: 이벤트 브로커 (Kafka/NATS/Pulsar), DB의 CDC, 대기열, 파일/로그 수집기.
2. 스트리밍 엔진: 창, 골재, 조이, 패턴 (CEP) 을 계산하고 상태 및 체크 포인트를 관리합니다.
3. 싱크: OLTP/OLAP 데이터베이스, 검색 엔진, 캐시, 주제, 쇼케이스/보고서 저장.
4. 스키마 레지스트리: 페이로드 진화 및 호환성 제어.
5. 관찰 가능성: 지표, 추적, 로그, 지연 및 워터 마크 대시 보드.
시간 의미론 및 순서
항상 이벤트 시간을 선호합니다. 이것은 지연 및 중단의 유일한 변하지 않습니다.
사건은 순서대로 나올 수 있습니다. 주문은 파티 키 내에서만 보장됩니다.
워터 마크는 다음을 허용합니
창문을 닫고 결과를 방출하십시오
"우리가 얼마나 기다리고 있는지" 지연된 이벤트 ('허용 _ lateness') 를 제한합니다.
늦은 이벤트의 경우 수정/수정: 집계 및 수정 이벤트의 재계산을 사용하십시오.
상태 및 신뢰성
키드 상태: 골재 데이터 (합, 카운터, 중복 제거 구조) 는 키로 뒤섞입니다.
Checkpoint/Savepoint-복구를위한주기적인 상태 스냅 샷; 세이브 포인트-코드 버전 마이그레이션을위한 관리 스냅 샷.
정확히 한 번 효력이 발생합니다
거래 "읽기 처리 된 쓰기" (커밋 싱크 + 읽기 위치);
dempotent 싱크 (upsert/merge) + 중복 제거 테이블;
다양한 집계 (낙관적 동시성).
Windows, 집계, 가입
창:- 텀블링: 간단한주기 보고서 (분, 시간).
- 호핑/슬라이딩: "슬라이딩" 메트릭 (1 분 단위로 5 분).
- 세션: 맞춤형 세션 및 사기 방지를위한 자연스러운.
- 집계: sum/count/avg/axx-different (HyperLogLog), 백분위 수 (TDigest/CKMS).
- 스트림 스트림 조인: '허용 _ skew' 를 존중하는 키와 시간별로 양쪽을 버퍼링해야합니다.
- 스트림 테이블 조인 (KTable) -디렉토리 또는 현재 상태를 공격합니다 (예: "활성 사용자 제한").
지연 및 중복 데이터로 작업
중복 제거: '이벤트 _ id' 또는 '(producer _ id, 시퀀스)'; "보기" 키를 TTL과 함께 저장하십시오.
늦은 이벤트: 닫은 후 'X' 에 대한 창 포스트 프로세싱을 허용합니다 (retractions/upserts).
허위 복제: 집계를 조정하고 로그에서 "ALREADY _ APPLIED" 를 수정하십시오.
규모 및 성능
주요 샤딩: 병렬 처리를 제공합니다. 뜨거운 키를보십시오.
배압: 병렬 처리를 제한하고 게시 할 때 배치 및 압축을 사용하십시오.
워터 마크: 너무 공격적이지 마십시오. 하드 워터 마크는 기대치를 줄이지 만 늦은 업데이트의 비율을 높입니다.
상태: 크기 및 액세스 패턴을 고려하여 형식 (RocksDB/State store/in memory) 을 선택하십시오. TTL을 청소하십시오.
자동 검사: 지연, CPU, 상태 크기, GC 시간.
신뢰성과 재시작
오프셋 고정으로 이데올로기 싱크 또는 트랜잭션 커밋은 정확성의 기초입니다.
다시 시작한 후 재 처리가 허용됩니다. 효과는 "정확히 한 번" 유지되어야합니다.
DLQ/주차장: 이유가있는 문제 기록을 별도의 스레드로 보냅니다. 재 처리를 제공합니다.
관찰 가능성 (측정 대상)
소스 별 (시간별 및 메시지 별)
워터 마크/현재 이벤트 시간과 늦은 이벤트의 비율.
처리량/대기 시간 연산자, p95/p99 엔드 투 엔드.
상태 크기/rocksdb I/O, 체크 포인트 속도/지속 시간.
DLQ 비율, 중복 제거/회수 비율.
CPU/GC/heap, 일시 정지 시간.
안전 및 준수
데이터 분류: PII/PCI를 다이어그램으로 표시하고 최소값을 저장하며 상태 및 스냅 샷을 암호화하십시오.
액세스 제어: 주제/상태 테이블 및 싱크대를위한 별도의 ACL.
소멸: 법적 요구 사항과 일치합니다 (GDPR/잊을 권리).
감사: 로그 '이벤트 _ id', 'trace _ id', 결과: 'APPLIED/ALREADY _ APPLIED/RETRIEVED'.
구현 패턴
1. CDC → 정규화 → 도메인 이벤트: 원시 데이터베이스 변경 사항을 브로드 캐스트하지 말고 이해할 수있는 비즈니스 사실에 매핑하십시오.
2. 한 데이터베이스 트랜잭션에서 생산자를위한 미리 보기: 트랜잭션 사실
3. 핵심 대 농축: 임계 흐름에서 최소 페이로드, 농축-비동기식.
4. 재생 친화력: 프로젝션/쇼케이스는 로그에서 재 조립해야합니다.
5. 설계 별 이념성: 운영/이벤트 키, 확실한 체계, 골재 버전.
테스트
단위/속성 기반: 골재 및 변환의 불변.
스트림 테스트: 고정 된 이벤트 스트림에서 순서가 다르고 중복 → 창 및 중복 제거 검사.
황금 창: 참조 창/골재 및 허용 가능한 늦은 조정.
결함 주입: "기록 된 효과" 와 "커밋 된 오프셋" 사이에 있습니다.
재생 테스트: 로그 시작 = 현재 상태에서 쇼케이스를 다시 조립합니다.
비용 및 최적화
창과 워터 마크는 대기 시간/리소스에 영향을줍니다. 창이 길어질수록 '허용 _ lateness' 가 클수록 상태가 커집니다.
코덱과 압축: CPU/네트워크 균형.
배칭 출력: 더 적은 수의 네트워크 호출 및 트랜잭션.
조기 필터링 ("푸시 다운"): 가능한 한 소스에 초과분을 버립니다.
안티 패턴
이벤트 시간이 필요한 시간을 처리하십시오 → 잘못된 분석.
싱크대에서 demotency 부족 → 재시작시 이중 효과.
글로벌 "메가 키": 하나의 핫 파티션이 병렬 처리를 깨뜨립니다.
공개 행사로서의 원시 CDC: 유출 된 DB 스키마, 진화의 취약성.
DLQ 없음: "유독 한" 메시지가 전체 파이프 라인을 차단합니다.
워터 마크 대신 하드 지연을 수정했습니다: 영원한 대기 또는 데이터 손실.
도메인의 예
지불/금융
스트림 결제. ', 사기 방지 (세션 + CEP) 창문,' operation _ id '의 할아버지.
회계 원장에 게시 될 때 정확히 한 번 효과 (upsert + 버전).
마케팅/광고
CTR/변환의 슬라이딩 창, 입찰을위한 집계 허용 오차로 클릭 및 노출에 참여하십시오.
iGaming/온라인 서비스
실시간 균형/제한, 임무/업적 (세션 창), 사기 방지 패턴 및 경고.
미니 템플릿 (의사 코드)
워터 마크 및 늦은 업데이트가있는 창
pseudo stream
.withEventTime(tsExtractor)
.withWatermark(maxAllowedLag=2m)
.window(TUMBLING, size=1m, allowedLateness=30s)
.keyBy(user_id)
.aggregate(sum, retractions=enable)
.sink (upsert_table )//idempotent upsert by (user_id, window_start)
오프셋 고정이있는 거래 싱크
pseudo begin tx upsert target_table using event, key=(k)
update consumer_offsets set pos=:pos where consumer=:c commit
생산 체크리스트
- 이벤트 시간 및 워터 마크 전략 정의; 창 및 '허용 _ lateness' 가 선택됩니다.
- Idempotent 싱크 또는 트랜잭션은 오프셋으로 커밋됩니다.
- 스키마 레지스트리 및 호환성 모드가 활성화됩니다. 추가 진화.
- 측정 항목: 지연, 워터 마크, p95/p99, DLQ, 상태 크기, 체크 포인트 지속 시간.
- 테스트: 고장난, 중복, 재시작, 재생.
- 상태 및 스냅 샷에 대한 PII/보존 정책.
- 스케일링 계획 및 역압 전략.
- 창 계약 및 조정 문서 (늦은 업데이트).
FAQ
이벤트 시간이 필요하십니까
지표와 일관성의 정확성이 중요하다면 그렇습니다. 처리 시간은 기술 계산/모니터링에 적합하지만 분석을 왜곡합니다.
정확히 한 번만 필요합니까?
요점: 중요한 효과가 있습니다. 더 자주, 적어도 한 번 + dempotent 싱크로 충분합니다.
창을 선택하는 방법?
비즈니스 SLA 구축: "마지막 5 분 →" 호핑 ", 사용자 세션 →" 세션 ", 분 보고서 →" 텀블링.
늦은 데이터와 어떻게해야합니까?
(PHP 3 = 3.0.6, PHP 4) 클라이언트 쇼케이스를 업데이트 할 수 있어야합
합계
대기 시간이 짧을뿐만 아니라 스트리밍은 시간, 상태 및 계약의 규율입니다. 이벤트 시간, 창문 및 워터 마크의 올바른 선택과 dempotent 효과, 관찰 가능성 및 테스트를 통해 파이프 라인을 신뢰할 수 있고 재현 가능하며 경제적으로 만들고 매일 밤마다 해결책을 찾을 수 있습니다.