13.7.1.2 HLC(Hybrid Logical Clocks) 기반 스케줄링 강제 편입 시스템

13.7.1.2 HLC(Hybrid Logical Clocks) 기반 스케줄링 강제 편입 시스템

Zenoh-Flow 데이터 스트림이 시간의 왜곡을 극복하기 위해 물리적 Event Time(발생 시간) 타임스탬프를 심어 넣었다 한들(13.7.1.1장 참조), 이 시스템에는 근본적인 시한폭탄이 도려내어지지 않은 채 남아있다. 바로 전 세계에 흩어진 1만 대의 로봇 엣지, 그리고 AWS 서버들의 OS 물리적 시간이 제각기 미세하게 틀어져 있다(Clock Drift) 는 잔혹한 현실이다.

NTP(Network Time Protocol) 서버 동기화조차 밀리초(ms) 단위의 오차를 남기며, 엣지 보드들의 싸구려 RTC(Real Time Clock) 칩은 온도에 따라 초당 수십 마이크로초씩 주기가 늘어지거나 줄어든다. 한국의 자동차 A 센서 시계가 일본 AWS 서버 시계보다 1초 느리고, 유럽의 관제탑 시계보다 0.5초 빠르다면?
데이터 캡슐에 찍힌 Event Time은 전혀 의미 없는 “거짓말의 향연“이 되고, 앞선 사건이 뒤에 일어난 것으로 둔갑하는 인과율의 시공간 붕괴(Causality Violation) 참사가 터진다.

본 절에서는 단절된 물리 시계망의 허구를 버리고, 분산망 백본에서 이벤트의 명확한 발생 순서(Before-After)의 척추를 세우는 궁극의 시간 체계, HLC (Hybrid Logical Clocks) 논리 시계 강제 주입 런북을 갈파한다.

1. 물리 시계의 파멸과 인과율(Causality)의 부재

노드 A(시계가 1초 느림)가 10:00:00 에 센서 데이터를 뽑아 네트워크로 쐈다.
노드 B(정상 시계)가 그 데이터를 10:00:01 에 받아본 뒤, 연산을 더해 “결론 C“를 뽑아 10:00:01 에 퍼블리시(Publish) 했다.

하지만 멍청한 백엔드 수집기(Sink)가 타임스탬프만 보고 정렬을 시도하면:

  • 결론 C 방출 타임스탬프 (노드 B에서 찍음): 10:00:01
  • 센서 원본 타임스탬프 (노드 A에서 뒤늦게 도착, 근데 시계가 느려 찍힌 시간은 09:59:59)

수집기는 “노드 B가 결론을 낸 뒤에(10:00:01), 노드 A가 센서를 긁어왔구나(09:59:59)?” 라고 과거와 미래가 산산이 조각난 쓰레기 데이터를 DB에 쑤셔 넣게 된다. 시스템의 논리 구조에서는 분명 A(원인)가 발생한 이후 B(결과)가 수행되었는데, 서로의 물리 시계 오차(Clock Drift) 때문에 인과율(Causal Ordering)이 박살 난 것이다.

2. HLC(Hybrid Logical Clock)의 교배: 물리 시간과 논리 카운터의 유착

이 시계열 폭동을 학살하기 위해, Zenoh-Flow 런타임의 메시지 규격은 구시대적인 단순 물리 시간(Physical Time)을 파버리고 그 자리에 하이브리드 논리 시계(HLC: Hybrid Logical Clocks) 구조체를 뼈대로 이식한다.

HLC는 각 장비의 물리적 시간(NTP)을 참조하되, 기기간 메시지 교환 시 서로의 카운터를 훔쳐보며 멱살을 잡고 논리적 정렬(Logical Counter)을 강제하는 돌연변이 시계다.

// [Zenoh-Flow 와이어 프로토콜 내부 HLC 스탬프 런북 구조]
pub struct HybridLogicalClock {
    // 1. 물리적 시계 영역 (장비 로컬의 대략적인 NTP 기반 시간)
    pub physical_time_ns: u64,
    
    // 2. 논리적 카운터 영역 (이벤트의 전후 인과관계를 결정하는 절대 무기!)
    pub logical_counter: u32,  
}

3. 감염(Infection)과 갱신(Tick)을 통한 단일 인과율 창조

HLC의 마법은 “메시지를 주고받는 행위” 자체에서 기적을 창발시킨다.

  • 수신 시 감염(Receive & Sync): 노드 B가 노드 A에서 보낸 캡슐 데이터를 큐에서 꺼낼 때, 데몬은 캡슐에 박혀있는 A의 물리시간 + 카운터 를 슬쩍 훔쳐보고 اپنے 현재 시계와 비교한다. 만약 내 시계가 A의 시간보다 과거라면 멍청한 물리 클럭의 스로틀을 부숴버리고, 내 내부 HLC 시간을 당장 A의 시간 스탬프(가장 최신값)로 강제 동기화(Advance) 해버린다.
  • 송신 시 각인(Send & Tick): 노드 B가 가공을 마친 뒤 뒷단 큐로 데이터를 사출할 때, 자신의 HLC logical_counter 를 반드시 +1 상승시켜 바이트 껍데기에 도장(Tick)을 찍고 던진다.

이 병적인 동기화 런북이 가동되면, 지구상 어떤 라즈베리 파이 단말기의 시계가 배터리가 다 되어 1년 전 과거로 타임슬립 했건, 어떤 대륙의 NTP 서버가 뻗어서 3초간 시계가 밀리건 상관하지 않게 된다.
메시지가 워커들을 관통할 때마다 마치 바이러스처럼 가장 선행된 타임스탬프와 증가된 카운터(Tick)가 전 네트워크를 오염시키며(Gossip Infection), “무조건 원인 데이터(A)의 HLC 값 < 결과 데이터(B)의 HLC 값” 이라는 완벽한 선형 수학적 불문율(Causality Preserving)이 인프라 전역에 각인된다.

분산 데이터 플로우 아키텍트에게 물리적 시계열(Physical Time)은 기만과 배신의 쓰레기장에 불과하다.
네트워크를 관통해 흐르는 데이터 캡슐들에게 스스로 사건의 순서를 갱신하고 증명하게끔 강제하는 인메모리 바이러스, HLC 구조체를 주입함으로써 시스템의 스케줄링은 비로소 인과율이 유지되는 불멸(Immortality)의 절대 시공간을 확보하게 되는 것이다.