13.8.4.1 통신망 단절(Network Partition) 상황의 데몬 큐(Queue) 백프레셔(Backpressure) 동작 제어

13.8.4.1 통신망 단절(Network Partition) 상황의 데몬 큐(Queue) 백프레셔(Backpressure) 동작 제어

Zenoh-Flow 파이프라인 코어가 아무리 강력하다 한들, 물리적인 LTE 안테나가 부러지거나 중국의 국가 방화벽(GFW)이 AWS 연결망을 절단(Network Partition)시켜 버릴 때, 클라우드 싱크(Sink) 노드 방향으로 흘러가던 데이터 캡슐은 망망대해의 진공관 앞에 멈춰 선다.

연결망 분단(Partition) 사태 시 가장 역겨운 시스템 붕괴 원인은 “단절되었다는 사실을 인지하지 못하고 계속 메모리에 쏴대는” 멍청한 송신 로직이다. 전송 소켓이 잘렸음에도 어플리케이션은 큐(Queue)에 데이터를 처박고, 결국 백프레셔(Backpressure)가 엣지 디바이스 전체의 RAM을 터트리며 커널 패닉을 유도한다.
본 절에서는 인프라 통신망 단절을 인지한 즉시, 멱살 잡힌 큐(Queue)의 통제권을 하드웨어 데몬 스로틀(Throttle)로 끌어내려 OOM 자폭을 원천 거세하는 오프라인 큐잉 백프레셔 생존 런북을 갈파한다.

1. 망 단절(Rupture)과 TCP 윈도우 사이즈의 질식

네트워크가 파손되면 데몬의 L4 코어 소켓(TCP) 송신 버퍼(Tx Buffer)는 순식간에 차오른다.
라우터는 “상대방으로부터 ACK를 받지 못했다” 고 판단하여 TCP Window Size를 서서히 Zero(0)로 닫아버린다.
이 커널 레벨의 폐쇄(Choking)는 애플리케이션 버퍼망(Zenoh-Flow MPSC Queue)을 향해 역주행하며 압력(Backpressure)을 가한다.

파이프라인 통신을 관장하는 워커 스레드는 send().await 지점에서 영원한 비동기 블로킹(Async Suspension)의 무덤에 빠진다. 만약 큐 사이즈가 10만 개로 넉넉하게 설정되어 있었다면, 소켓이 막혀도 RAM은 앞단 센서로부터 쏟아지는 10만 개의 거대한 카메라 프레임을 무식하게 집어삼키며 리눅스 시스템에 “메모리 할당(OOM)“의 비명을 유발한다.

2. 큐 만수위(Capacity Limit) 통제와 능동적 절단(Tail-Drop)

이 파멸을 방어하기 위해 Zenoh-Flow 매니페스트 아키텍트는 분단(Partition) 위협이 도사리는 링크 배관구간의 Queue Size 를 무한대(Unbounded)로 설정하는 파멸적 패착을 범해서는 안 된다.
물리 메모리에 허용된 극한의 캡(Cap), 예를 들어 queue_size: 50 을 하드코딩으로 무조건 주사 박아 넣어야만 한다.

큐가 50개가 차는 순간, 즉 통신망 단절 1초 뒤! 데몬 스케줄러의 타격 위상은 두 가지 행동 교정을 강제한다.

  1. Drop-Oldest (가장 오래된 놈 도살): 새로운 51번째 데이터(최신 카메라 프레임)가 들어올 때 큐 공간이 없으므로 블로킹(Blocking)을 타지 않는다. 대열의 맨 앞에 서서 망이 뚫리길 하염없이 기다리고 있던 낡고 오래된(Stale) 가장 쓰레기 같은 1번째 패킷을 메모리 밖으로 내던져 찢어버린다(Drop). 그리고 그 자리에 방금 도착한 가장 신선한 51번째 패킷을 끼워 넣고 대기열을 회전시킨다.
  2. Backpressure Sleep 전파: 이 꼬리 짜르기(Drop)의 유혈 사태가 발생 빈도 한계치를 돌파하면, 데몬은 파이프라인 맨 앞단 소스 카메라 노드를 향해 “망이 끊겼으니 모터 생산 스케줄을 아예 재워버려라!” 라는 Sleep 펄스를 발동(13.7.3.2장 참조) 시킨다.

3. 분단 격리(Partition Tolerance)의 자급자족적 고립(Isolation)

망 단절 상황에서 클라우드로 보내야 할 대용량 비디오 정보들은 50개가 찰 때마다 여지없이 찢겨 지고 증발(Drop)한다.
그러나 이 메모리 버리기(Memory Discard) 런북 덕분에 시스템은 위대한 보상을 쟁취한다. 엣지 로봇의 CPU 클럭과 메모리는 99% 의 쾌적한 가용 스페이스를 확보하게 된다. 자율주행 알고리즘을 수행해야 하는 로컬(Local) 연산 노드들은 메모리 압박이 전혀 없는 상태에서 초당 100번의 브레이크 연산을 오류 없이 쾌적하게 꽂아 넣는다.

만일 망 단절이 왔다고 에러를 터트리며 대기하거나, 큐를 무한정 늘려서 모든 데이터를 모아두려 했다면, 그 체증으로 말미암아 자율주행 모터를 제어하는 C++ 스레드까지 함께 컨텍스트 스위칭 지연(Starvation)의 블랙홀에 빨려 들어가 로봇 전체가 벽에 들이박았을 것이다.
인프라스트럭처의 망이 찢어졌을 때 (Network Partition), 백프레셔로 큐를 질식시키느니 차라리 통신을 향하는 외곽망 데이터를 자비 없이 도살(Drop)하여 로컬 연산의 절대 무결점 생존성(Availability)만이라도 사수해 내는 결정. 이것이 CAP 정리에서 파티션 분단 시 완전무결한 일관성(Consistency)을 버리고 엣지 생존(Availability)의 가용성을 쟁취하는 런북의 뇌관이다.