20.6.3.3 거대 괴사(Cascade Failure) 방어를 위한 데드 레터 큐(Dead Letter Queue) 병합 및 다운스트림 폐기 런북

20.6.3.3 거대 괴사(Cascade Failure) 방어를 위한 데드 레터 큐(Dead Letter Queue) 병합 및 다운스트림 폐기 런북

단일 오퍼레이터(Operator) 노드의 버그가 백프레셔(Backpressure) 역류 파동을 일으켜 앞단의 생존 노드들까지 줄줄이 참수시키는 파이프라인(Zenoh-Flow) 공유 메모리 파멸 모델을 목도했다(20.6.3.2장 참조).
데이터플로우 네트워크에서 “가장 앞쪽 노드는 가장 소중하다”. 카메라 소스 노느나 라이다(LiDAR) 노드가 블로킹되어 데이터를 못 캐오고 죽어버리는 순간, 이 로봇은 장님으로 전락하며 즉살 당한다.

파멸 구조를 끊어내려면 단 하나, 앞쪽 노드가 send() 를 쳤을 때 뒷단 노드가 안 받아서 큐가 꽉 차 있더라도 절대 스레드를 블로킹 시키지 않고(Non-blocking) 텐서를 다른 “시체 폐기장” 으로 쓸어버리는 냉혈한 이데올로기가 강제되어야 한다.
본 절에서는 큐 막힘 현상을 인지하는 순간, 거대 괴사(Cascade Failure)로 이어지기 전 결괏값 포인터를 찢어발겨 하수구로 버리는 데드 레터 큐(Dead Letter Queue, DLQ) 병합 및 타임아웃 다운스트림 폐기 런북을 갈파한다.

1. Blocking 배관의 파괴와 타임아웃(Timeout) 주입

아키텍트는 데몬 스레드를 감싸 안는 C++ 파이프라인 코드 작성 규약을 갈아엎는다.
절대 뒷단이 텐서를 집어삼킬 때까지(ACK) 무한정 대기하는 send_blocking 방식의 API 호출을 처형해야 한다.
대신 찰나의 순간 동안만 기다리다가, 못 받아먹으면 가차 없이 손목을 끊어버리는 try_send 와 타임아웃 한계선을 들이민다.

// [백프레셔 역류 차단을 위한 Non-blocking 타임아웃 폐기 런북]

void CameraSourceNode::on_tick() {
    auto frame_capsule = read_camera_hardware();

    // 1. 최악을 방어한다. 내 텐서를 다운스트림 큐에 쑤셔 넣어본다.
    // 하지만 5밀리초(ms) 넘게 뒷단이 이걸 안 받아가고 큐가 정체되어 있다면?
    auto result = this->channel->try_send(frame_capsule, std::chrono::milliseconds(5));
    
    if (!result.is_ok()) {
        // [경악의 척살령!] 
        // 뒷단 노드(사물인식)가 파업 중이거나 죽어있다. 내가 같이 블로킹될 이윤 없다!
        // 방금 찍은 소중한 10MB짜리 카메라 원본을 가차 없이 파쇄기(Drop)에 던져버린다!
        warn!("Downstream is choking! Dropping frame to survive...");
        frame_capsule.destroy(); // 레퍼런스 카운트 소멸. 즉각 메모리 Free 강제!
        
        // 추가: 이 버려진 "시체(Dead Letter)" 에 대한 분노의 로깅을 DLQ 에 기록한다.
        send_to_dlq(metadata); 
    }
}

이 런북이 가동되는 순간, 중간의 사물인식 오퍼레이터가 뻗어서 큐가 100% 포화되더라도, 맨 앞단의 카메라 소스 노드는 1초에 60번씩 스로틀을 던지다가 5ms 마다 쿨하게 그 데이터를 허공에 증발시키며(Frame Drop) 파이프라인 전체가 피가 도는(Alive) 기적을 이뤄낸다.

2. 데드 레터 큐(Dead Letter Queue)와 장애 핀포인트 추적

데이터를 버려서 시스템 전체가 동반 자살(OOM)하는 건 막았다! 하지만 버렸다는 사실마저 은폐해 버리면 아키텍트는 왜 로봇이 사물을 인식 못 하고 바보가 되었는지 평생 깨닫지 못한다.
버려진 텐서 바이트(10MB) 그 자체는 소각장에 태워버리되, 그 영수증(시체 검안서)은 반드시 데드 레터 큐(DLQ) 라는 우회 배관으로 밀어 넣어 중앙 클라우드 관제 지옥으로 보내야 한다(Pub/Sub Off-loading).

# [파이프라인 백엔드의 무결점 감사(Audit)를 위한 DLQ 그림자 배관 강제]
sinks:
  - id: "DLQ_Ejector"
    uri: "file:///opt/zenoh_flow/builtin_sinks/zenoh_pub_sink.so" 
    configuration:
      key_expr: "telemetry/robot_1/alerts/dlq_dropped"

links:
  # 카메라가 에러를 뿜고 텐서를 버렸을 때 나오는 경보 문자열을 처리하는 DLQ 배관 핀포인트
  - from: { node: "Camera", output: "error_log" }
    to: { node: "DLQ_Ejector", input: "in" }

3. Graceful Degradation (우아한 기능 저하) 사상의 실현

이로 인해 달성되는 시스템 물리 위상은 “우아한 기능 저하(Graceful Degradation)” 다.
사물인식 노드가 크래시 난다면? 그 노드 자체의 텐서 연산만 멈추고 프레임은 버려지지만, 카메라는 여전히 살아서 돌며 경보를 울려대고, 이 경보를 받은 관제탑 마스터 파이썬 데몬은 이를 즉각 인지하고 “자율주행 모드를 중단하고 비상 셧다운 모터 제어 신호 퍼블리싱“을 발동시킬 수단을 거머쥔다!

공유 메모리를 파괴시키지 않는 범주 내에서 약한 노드 하나를 고립시켜 쳐내고 시스템 본선의 코어 스레드를 영구 보존하는 힘. 데이터(Data)가 소중하다는 강박을 부수고, 레이턴시와 파이프라인의 가용성(Availability, 살아서 심장 박동을 뛰는 것) 에 최우선 마스터피스를 바치는 것. 거대 괴사(Cascade Failure)를 1마이크로초 의 드롭(Drop)으로 틀어막는 가장 비정하고 확고한 아키텍트의 피의 규율이다.