13.9.2.2 Queryable 응답기 장착 및 상태 직렬화(Serialization) 전송 콜백 함수

13.9.2.2 Queryable 응답기 장착 및 상태 직렬화(Serialization) 전송 콜백 함수

분산 네트워크 너머에서 마스터 관제탑이 파이프라인 워커 노드의 내부로 GET 질의 수술용 메스를 들이댈 때(Queryable 백도어, 13.9.2.1장 참조), 로봇단 C++ 노드의 심장이 아무리 펄떡이는 생생한 데이터 상태(State)를 품고 있더라도 이것을 네트워크 선로 위로 뱉어내려면 끔찍하고 무자비한 해체주의 과정을 거쳐야 한다.

RAM 안에 구불구불 할당된 이진 트리의 포인터 노드들이나 3차원 C++ 텐서 배열 구조체(Struct)는 로봇의 마더보드를 떠나 네트워크 전선 바이크로 승차하는 순간 무용지물 조각 코드가 된다.
본 절에서는 관제탑이 RPC 질의(Query) 충격파를 갈겼을 때, 오퍼레이터 노드 콜백 훅 안에서 그 복잡한 메모리 뇌수를 1차원의 바이트 평면으로 무자비하게 으깨버리는(Serialization) 압축 런북과, 이를 다시 역조형하는 해방 공간을 구조화한다.

1. 메모리 객체(Object)의 폐쇄성과 1차원 바이트 평면 회귀

C++ 언어로 작성된 딥러닝 오퍼레이터 노드는 안에 이런 거대하고 혐오스러운 상태 객체를 달고 있다.

// [오퍼레이터 내부의 끔찍하고 더러운 비선형 메모리 덩어리]
struct DeepLearningContext {
    int frame_count;
    std::unordered_map<int, std::vector<float>> past_activations;
    cv::Mat last_tracked_face; // GPU VRAM 참조 포인터의 난항!
};

이걸 통상적인 초보 엔지니어들은 JSON 텍스트로 문자화(Stringify)시켜 넘기려 든다. 하지만 자율주행의 마이크로초를 다투는 도메인에서 std::vector<float> 수백만 개를 "[0.123, 0.456, ...]" 따위의 ASCII 문자열로 번역하고 있으면 로봇 엣지의 CPU는 그 텍스트 파싱을 하느라 수만 사이클의 클럭을 낭비하고 타죽는다(CPU Burnout).

2. Zero-overhead 이진 직렬화(Binary Serialization)의 강제

하드 리얼타임 생태계의 Queryable 콜백 함수 내에서 상태(State) 폭발을 수행할 땐, 텍스트(JSON)를 철저히 혐오하고 오직 메모리 바이트 배열 그대로를 으깨서 보내는 Protobuf, FlatBuffers, 혹은 Bincode 류의 이진 직렬화 타격을 고수해야 한다.

// [RPC 상태 탈취 콜백 함수 내부의 Bincode 직렬화 런북]

this->internal_query_server = zs.declare_queryable(
    "robot/node_state/dl_context", 
    [this](zenoh::Query%20query) {
        // 관제 마스터가 내 "Context" 를 훔치러 왔다!
        
        // 1. 텍스트 변환 따윈 하지 않는다. 내 C++ struct 덩어리의 포인터 관계를
        // Bincode/Flatbuffers 등 초고속 레이아웃으로 복제하여 0.1ms 안에 플랫 바이트(std::vector<uint8_t>)로 납작하게 누른다.
        std::vector<uint8_t> flat_binary = flatbuffers_press_machine(this->my_dl_context);
        
        // 2. 으스러진 1차원 바이트 배열을 그대로 네트워크 응답(Reply) 캡슐에 때려 넣는다!
        // (content_type 은 일반 스트링이 아님을 분명히 경고해 둔다)
        query.reply("robot/node_state/dl_context", flat_binary)
             .encoding("application/octet-stream") 
             .res();
    }
).res();

Flatbuffers 나 단순 memcpy 에 가까운 이진 압살 직렬화 덕에, 로봇의 CPU는 “자신의 뇌 구성을 관제탑에 보고하는(Audit) 작업” 때문에 정작 자기가 돌아야 할 자율주행 배관 연산(Dataflow)을 방해받지 않게 된다.

3. 원격 관제망의 타점(End-point)에서의 자아 역-수복(Deserialize)

태평양 건너 본사 관제탑의 클라우드 서버는 이 차갑고 뻣뻣한 바이트 덩어리(octet-stream)를 네트워크 RPC 응답값으로 받게 된다.
관제탑은 사람이 아니다. 관제탑의 Python 이나 Rust 어플리케이션은 즉각적으로 이 데이터 조작물에 생명을 불어넣어야 한다.

# [위성 마스터 관제탑의 이진 응답 해체 및 논리 복원 런북]
import zenoh
import flatbuffers
from RobotStateSchema import DeepLearningContext # IDL(Interface) 스키마 사전 구비

session = zenoh.open()
replies = session.get("robot/node_state/dl_context")

for reply in replies:
    # 엣지 로봇이 던진 순수 이진 바이트(bytes)를 후벼판다!
    raw_bytes = reply.ok.payload
    
    # Text 파싱이 아니다! C언어 메모리 레이아웃 그대로를 인터페이스에 매핑(Cast)하여 부활시킨다.
    recovered_context = DeepLearningContext.GetRootAsDeepLearningContext(raw_bytes, 0)
    
    print(f"Audit Complete! Robot recorded {recovered_context.FrameCount()} frames.")

Get -> Serialize(Binary) -> Network -> Deserialize(Binary) -> Read 의 순환.
인프라망 외곽의 관제자가 분산 파이프라인의 내장을 푹 찔러 내부의 이기종(C++) 컨텍스트 정보를 탈취하는 쾌감극. JSON 규격의 기만적이고 나태한 사람 중심 파싱을 부정하고, 엣지(Edge)의 컴퓨팅 연산 오버헤드를 제로화하기 위해 기계 간 이진 계약(Binary Schema Contract)만으로 네트워크 페이로드를 조각해 버리는 것. 이 무결한 직렬화/역직렬화(SerDe) 콜백 사상이 하드 리얼타임 데이터 분산 제어의 심연을 관통하는 율법이다.