13.4.4.2 역류(Cycle) 방지를 위한 방향성 비순환 그래프(DAG) 강제와 메모리 포화 락(Deadlock) 회피 전술
데이터 스트림 처리(Data-flow Processing) 생태계를 디자인하는 아키텍트에게 쥐여지는 무제한적인 링크(Link) 연결의 자유는 필연적으로 끔찍한 오만함(Hubris)을 부른다.
노드 A에서 가공된 파이프가 노드 B를 거쳐 노드 C로 흐를 때, 초보 엔지니어는 제어 피드백(Feedback)을 구현하겠다는 망상에 사로잡혀 노드 C의 출력 밸브를 다시 맨 앞단인 노드 A의 입력 포트로 거꾸로 꿰매어(Rewire) 버리는 만행을 저지른다.
이 데이터의 역류, 이른바 루프(Loop) 현상이 분산 런타임 큐에 도달하는 순간, 시스템은 꿀을 머금고 무한 증식하는 뱀(Ouroboros)처럼 자기 자신을 포식하다가 시스템 전역 메모리 포화(Deadlock)에 빠져 추락한다. 본 절에서는 사이클(Cycle)의 저주를 척살하고, 오직 방향성 비순환 그래프(DAG, Directed Acyclic Graph) 만을 파이프라인의 생존 법칙으로 강제하는 통제 런북을 설파한다.
1. 꼬리를 무는 역류(Cyclic Link)와 무한 증식 루프의 파괴력
만들어진 노드 사슬 A -> B -> C 에서, C -> A 로 배관을 우회 접합하여 데이터 흐름에 링(Ring) 루프를 형성했다고 치자.
소스(Source) 카메라가 새 프레임을 A로 밀어 넣으면:
- A는 처리하여 B로 건넨다.
- B는 C로 건넨다.
- C는 연산 결과를 다시 A로 돌려(Feedback) 보낸다.
문제는 소스(Source) 노드가 멈추지 않고 계속해서 외부 세계의 새 데이터를 A의 입력 큐에 밀어 넣고 있다는 점이다.
A의 연산 스레드 큐에는 밖에서 들어오는 신규 프레임과, C에서 역류해 돌아온 과거 프레임의 망령들이 동시에 미친 속도로 적재되기 시작한다. A는 이 양쪽의 압력을 처리하느라 속도가 지연(Lag)되며, 결국 C가 뱉어내는 역류 패킷을 다 받아먹지 못하게 된다.
파이프라인 역류의 백프레셔(Backpressure)가 발동하여 C의 출력 큐가 가득 차고 블로킹(Blocking)이 걸린다. C가 막히면 B가 막히고, B가 막히면 A가 다시 출력을 못 해버린다. 불과 3초 만에 큐(Queue) 메모리가 100% 한계치에 충돌하며 연산망 전체 스레드가 꼼짝하지 못하는 완벽한 영구 동결, 순환 교착 상태(Circular Deadlock) 에 추락하는 것이다.
2. DAG 위상의 구조적 강제(Strict Enforced Execution)
이 치명적 자해를 용인하지 않기 위해, Zenoh-Flow 컴파일러 및 런타임 데몬 레이어는 링킹(Linking) 토폴로지 해석 단계에서 무자비한 위성 스캐너(DAG Verifier)를 들이민다.
파라미터 매니페스트 yaml 파일을 데몬에게 읽히는 찰나, 런타임 파서는 전체 링크 배관의 위상 수학적(Topological) 그래프 위상 트리 검증 알고리즘을 수행한다. 만일 단 한 줄의 link 선언이라도 거꾸로 거슬러 올라가 이전 노드의 수신 포트를 때리는 순환 연결성(Cycle Path)이 탐지되면, 프레임워크는 즉각적으로 “Cycle Detected in Pipeline Graph!” 란 붉은색 치명타 에러(Fatal Error) 로그를 내뿜고 시스템 배포(Deploy) 자체를 영원히 격리 차단(Abort)해 버린다.
오직 소스(Source)의 고지대에서 산기슭을 타고 싱크(Sink)의 저지대로 한 번도 거스르지 않고 흘러 내려가는 방향성 비순환 그래프(Directed Acyclic Graph, DAG) 의 순결한 폭포수 모델만이 메모리 폭주 스케줄링의 공포로부터 스웜 인프라를 지탱하는 진리다.
3. 피드백 루프(Feedback Loop) 수요에 대한 회피와 분리 전술
“자율주행의 PID 제어나 상태 오차가 발생했을 때 윗단의 노드에게 이전 값을 피드백(Feedback)으로 먹여줘야 하는데 어떡하는가?”
이 정당해 보이는 알고리즘적 항변 조차도 데이터-플로우 네트워크 주권 아래선 허용되지 않는다.
데이터 제어 플로우의 피드백 통신망은 메인 스트림 파이프라인의 큐-링킹(Link) 배관 안에 세를 얻어 기생하려 들어서는 안 된다. 만약 C 노드가 A 노드에게 모터 피드백이나 에러 보정 값을 보내야 한다면, 이 둘은 Zenoh-Flow 의 정식 컴포넌트 링크 파이프 배관을 찢어서 연결하는 것이 아니라, 아예 백그라운드의 전혀 다른 통신 지류(사이드 채널), 즉 일반 Zenoh pub/sub API 채널을 우회적으로 동원하여 통신해야(Bypass Route) 한다.
- 메인 배관(Zenoh-Flow DAG): 센서 데이터의 고용량, 고속 하향식 무결점 폭포수 강하(Down-Streaming).
- 사이드 배관(Native Zenoh): 상태 제어 변수나 소량의 피드백 보정값을 비동기적으로 주고받는 얇은 혈관망.
파이프라인 내의 역류(Cyclic Link)를 수학적으로 봉쇄하는 것. 이 무결한 이원화 분기 결단이야말로 메모리의 증폭과 인메모리 뮤텍스 락(Lock)의 공포를 무한정 억제하고 스웜 라우터의 심장 박동을 영속시키는 자비 없는 무결성(Integrity) 지휘다.