13.8.1.1 데몬 간 헬스체크(Heartbeat) 통신 및 Liveliness 패킷 감시망 구축
거대한 대륙 간 스웜망(Swarm Network) 위에서 1천 개의 자율주행 Zenoh-Flow 파이프라인 데몬(Worker)들이 쇳덩어리를 굴리며 동시다발적으로 돌아가는 권력의 통치 체계에서, 아키텍트가 마주해야 하는 두려움은 침묵(Silence)이다.
한국 공장에 있는 로봇 A의 영상이 갑자기 끊겼을 때, “네트워크가 터진 것인가?”, “로봇 데몬 엔진이 OOM(Out of Memory)으로 자폭한 것인가?”, 아니면 “단순히 어두운 밤이라 펌프(Camera Source)가 보낼 영상 바이트가 없는 것뿐인가?”
이 심연을 판독하지 못하고 데이터가 없다고 그저 대기(Wait)만 하는 멍청한 스케줄러는 시스템의 결함 대응 속도를 박살 낸다. 본 절에서는 침묵이 뻗음(Crash)인지 고요(Idle)인지 명확히 갈라치기 위해 시스템 뼈대 밑바닥으로 흐르는 생체 인식 펄스, 즉 헬스체크(Heartbeat) 및 Liveliness 통제망 구축 런북을 갈파한다.
1. 데이터 부재(Silence)와 Liveliness 토큰 선언의 권력
카메라 소스 노드는 원래 초당 30Hz로 캡슐을 쏜다. 그런데 앞단을 가려버리거나 소스 노드 코드가 if 문 에러에 빠져 5초 동안 데이터 사출 밸브가 잠겨버렸다(Silence).
멀리 떨어진 클라우드의 오퍼레이터(Operator) 노드는 큐가 텅 비어있으니 그저 멍하니 잠을 잔다. 클라우드는 엣지의 딥러닝 카메라 코드가 폭사한 상태인지 평온하게 렌즈를 닫아둔 상태인지 구별할 지능이 없다.
이를 타파하기 위해 Zenoh 는 Liveliness(생존) 감시망을 파이프라인의 밑바닥에 본능적으로 주입한다. 개발자는 데이터 전송 외에, 연결된 노출 포트 자체의 생애 주기를 데몬 코어망에 등록한다.
// [Zenoh-Flow 런타임 하부 생존 선언망(Liveliness) 런북]
// 1. 소스 퍼블리셔를 만들 때, "나는 살아있다"는 징표(Liveliness Token)를 강제로 선포한다.
let liveliness_token = z_session
.declare_liveliness("edge/robot_A/camera_node/alive")
.res().await?;
// 이 코드가 런타임을 타고 도는 순간!
// 데몬 로컬 프로세스는 이 "alive" 토큰의 목줄을 쥐고 백그라운드 스레드에서
// 전 세계 마스터 데몬들을 향해 1초에 한 번씩 하트비트(Heartbeat) 펄스를 날려 보낸다!
2. 심박수(Heartbeat) 백그라운드 멀티캐스트와 커널 프리즈(Kernel Freeze) 판독
Liveliness 펄스는 무지막지한 텐서(Tensor) 파이프라인 배관을 더럽히지 않는다. 데이터플로우 라우팅망과는 별개로, 데몬 간의 시스템 UDP/TCP 멀티캐스트 컨트롤 플레인(Control Plane)의 혈관을 타고 나노초의 속도로 파동을 친다.
- 어플리케이션 침묵: 파이썬 코드가 짜증을 내어
on_data무한 루프 블로킹에 빠졌거나 프레임 사출을 실패했다. 하지만 데몬은 아직 살아있다. 백그라운드 러스트(Rust) 엔진이 하트비트(Heartbeat) 펄스를 마스터로 잘 쏘고 있다. -> 진단: 네트워크/전원은 멀쩡하나 어플리케이션 알고리즘 노드가 정지함. - 데몬/운영체제 멸절: 로봇의 전원이 뽑히거나 컨테이너가 킬(Killed)당했다. 러스트 데몬 자체가 폭파되면서 심장 박동(Heartbeat) 펄스가 1.5초(Threshold) 이상 끊긴다. -> 진단: Node Crash, 인프라스트럭처 즉시 멸절 파악.
3. Liveliness Event 폭격과 통치자의 결단 (Subscriber)
전 지구상 1만 대의 데몬 심박수를 통제하는 관제(Master) 스크립트는 이 거대한 심장 소리의 교향곡을 가만히 앉아서 구독(Subscribe)하기만 하면 된다.
로봇 A의 전원선을 강제로 끊어버린 그 찰나 1~2초 후, 관제 터미널에는 죽음의 신호가 떨어져 내린다.
// [마스터 관제탑의 시스템 죽음 포착 런북]
let liveliness_subscriber = z_session
.declare_subscriber("edge/**/alive")
.reliability(z::Reliability::Reliable)
.res().await?;
while let Ok(sample) = liveliness_subscriber.recv_async().await {
match sample.kind {
// 생명의 박동! 언제든 새로운 노드가 파이프라인망에 꽂히면 폭발적으로 알림이 온다.
z::SampleKind::Put => info!("Node Alive! UUID: {}", sample.key_expr),
// [죽음의 타각] 전원선 단락, OOM 커널 패닉, 랜선 뽑힘!!
z::SampleKind::Delete => error!("FATAL: Node Dead or Demolished! UUID: {}", sample.key_expr),
}
}
이 Liveliness 감시망 파동에 의해, 분산 데이터플로우의 아키텍트는 “데이터가 안 온다” 는 무능한 수동적 판단을 버린다. 백그라운드에서 데몬 엔진들이 스스로 주고받는 고결한 심박수 펄스를 해킹(Subscribe)해 가져옴으로써, 엣지 터미널의 물리적 절단이나 L4 네트워크 분리 현상(Network Partition)을 인프라스트럭처 레벨에서 찰나에 도려내어 적발하는 극단의 헬스 체크 시스템을 완성하는 것이다.