13.7.1.3 네트워크 지연 도착(Late-Arrival) 조율을 위한 워터마크(Watermark) 댐 방류 기법
데이터 캡슐에 절대 진리인 하이브리드 인과율 시계(HLC) 딱지를 단단히 붙였다(13.7.1.2장 참조) 한들, 분산 통신망의 잔혹한 환경적 결함은 인프라를 농락한다.
한국 땅 센서가 던진 데이터(10:00:00 사건)는 LTE 음영 구역을 지나느라 5초 뒤에야 관제 융합 노드(Sink)의 큐 뒷단에 질척거리며 떨어진다(Network Late-Arrival).
타임스탬프를 정렬(Time Aligning)하며 데이터를 기다리는 연산 노드 스레드 입장에선 참혹한 딜레마에 봉착한다. “언제까지 과거의 파이프라인 수신 큐(Queue)를 잠그고(Hold) 늦게 도착하는 이탈 패킷을 기다려야 하는가?” 어설프게 무한정 기다리면 자율주행은 지연(Latency) 되어 벽에 충돌하고, 서둘러 닫아버리고 연산을 해치우면 지각(Late) 도착한 시계열 파편 패킷들은 버려져 데드 데이터(Dead Data Drop)가 된다.
본 절에서는 기다림의 미학을 버리고 폭력적 강제 시간을 부여하여 스트림 배관의 잠금장치를 해제해 버리는, 스케줄링의 결단력인 타임 워터마크(Time Watermark) 댐 방류 아키텍처를 설파한다.
1. 큐 홀드(Queue Hold)의 맹점과 타임 록(Lock) 지연
도착하는 데이터들의 Event Time 순서를 맞추기 위해, 연산 오퍼레이터 노드 앞단에는 ‘타임 정렬(Time-Alignment) 버퍼’ 가 존재한다.
10:00:01 에 찍힌 데이터가 10:00:05 의 데이터보다 늦게 도착할 때를 대비해, 큐(Queue) 엔진은 메모리를 빵빵하게 스로틀 잡은 채 데이터들을 모으고 또 모은다. (Hold & Sort)
하지만 그 “과거의 지각생 패킷“이 영영 케이블 단선으로 안 올 놈인지, 아니면 0.1초 뒤에 도착할 놈인지 큐(Queue) 엔진은 판독할 지성이 없다. 연산 스레드는 꼼짝하지 못하고 타임스탬프의 순서만 기다리며 파이프라인 전체가 피가 통하지 않는 빈혈(Starvation) 상태에 돌입하게 된다. 실시간 통찰(Real-time Insight) 시스템이 한 줌의 지각 패킷 때문에 시스템의 처리 시간(Throughput Processing) 전체를 볼모로 잡히게 되는 것이다.
2. 워터마크(Watermark) 구조 명세와 댐(Dam)의 방류 결단
이 지독한 병목을 학살하는 영웅이 바로 Zenoh-Flow 선언 아키텍처의 Watermark(수위 표시선) 메커니즘이다.
워터마크란 “이 시점(Event Time T) 이전의 과거를 담은 데이터 패킷은, 전 지구적으로 모든 노드들이 통신망 큐에 다 쏟아부었고 더 이상 지각 도착(Late)하지 않을 것이다!” 라는 프레임워크 런타임의 글로벌 선언(Global Assertion) 메시지다. 거대한 시간의 이정표다.
// [파이프라인 와이어를 관통하는 Watermark 프로토콜 런북]
// 워터마크 메시지 자체가 노드의 큐를 타고 데이터 캡슐과 함께 흘러 다닌다!
pub enum ZFlowProtocolMessage {
Record(DataCapsule), // 일반 비전 텐서 데이터 캡슐
Watermark(EventTimestamp), // [파이프라인 통수권 장악] "이 시간표를 닫는다!"는 특수 령(令)
}
소스(Source) 노드나 마스터 타임브로커는 주기적(예: 100ms마다)으로 “지금 시간이 10:00:01.000 이니, 이제 10:00:00.800 까지의 데이터는 다 온 셈 치자!“라며, Watermark(10:00:00.800) 라는 특수 메시지 알약을 파이프라인 배관(Link)에 억지로 쑤셔 넣는다.
3. Watermark 도달 시 윈도우(Window) 강제 폐쇄 및 처리 폭발
이 맹렬한 Watermark(T) 혈전 캡슐이 파이프 큐를 타고 돌아다니다가, 연산 대기 중인 오퍼레이터(Operator) 노드의 입력 버퍼 문턱에 부딪히는 순간 아키텍처의 혁명이 발생한다.
- 대기 잠금 강제 해제 (Flush Trigger): 노드는
Watermark(T)캡슐을 파싱하는 1나노초의 직후, 타임 정렬 큐(Time-Aligned Queue) 버퍼 안의 내용물을 뒤진다. 그리고 스탬프가T이전으로 찍힌 녀석들이 있다면, 더 이상 지각생을 기다리지 않고 지체 없이 전부 C++ 뒷단 연산 함수(on_data())로 한꺼번에 때려 넣어(Evaluate) 버린다! 댐의 수문이 위로 열리고 억눌렸던 폭포수(Windowed Data)가 단숨에 처리 로직을 타고 쏟아진다. - 지각생의 도살 (Late Data Dropping): 수문이 열리고 댐 방류(Evaluation)가 끝난 후, 5초 뒤에 늦어버린 멍청한 센서 패킷(Event Time
T - 1초짜리)이 큐에 터덜터덜 도착했다고 가정하자. 노드의 스케줄러는 그 쓰레기의 Timestamp 가 이미 자신이 집어삼킨Watermark(T)보다 작다는 것을 즉각 인지한다. 노드는 어떠한 연산도 호출하지 않고 그 지각(Late) 도착 패킷 데이터를 자비 없이 메모리 밖으로 도살해 버린다(Drop).
파이프라인 시스템에서 완벽한 무결점(No Loss) 수집에 집착하며 무한히 기다리는 큐(Queue) 통치자는 시계열 스케줄링의 하수 중의 하수다.
데이터의 지연과 손실을 분산 세계관의 피할 수 없는 섭리(Entropy)로 겸허히 인정하고, 런타임에 “시간의 수위(Watermark)” 라는 파괴적 선언을 주기적으로 던져 댐 스로틀(Throttle)을 무자비하게 터트려주는 자비없는 결단. 이것이야말로 딥러닝 융합(Fusion) 연산 노드들을 L3 캐시 메모리 락(Lock) 지옥에서 해방시키고, 수만 대 글로벌 스웜 엣지의 심장 박동(Tempo)을 강제 동기화시키는 절대 시계열 엔지니어링의 정수(Essence)다.