9.3.2.1 비동기 파이프라인의 엄격한 분리(Asynchronous Pipeline Segregation)

9.3.2.1 비동기 파이프라인의 엄격한 분리(Asynchronous Pipeline Segregation)

Zenoh를 통신 중추로 활용하여 C++이나 Python과 달리 대규모 컨커런시(Concurrency) 엔진을 운용할 수 있는 Go 백엔드 관제 인프라를 구축할 때, 코딩의 기교보다 훨씬 압도적으로 중요한 결단은 데이터 이동 계층을 분절(Segmentation)하는 아키텍처 디자인에 있다.

이른바 Monolithic Callback – 즉, Zenoh 라우터가 발포한 수신 이벤트 하나에 데이터 파싱, 로깅, 머신러닝 임계치 검사, 그리고 데이터베이스 IO 커밋까지 모든 비즈니스 로직을 한 덩어리로 묶어버리는 설계는 시스템의 응답 탄력성을 완전히 압살시킨다. 본 절에서는 통신 인그레스(Ingress) 레이어와 심연의 데이터 연산 레이어를 철의 장막으로 갈라치는 비동기 파이프라인 엄격 분리 전술(Asynchronous Pipeline Segregation) 을 전개한다.

1. 속도 불일치(Impedance Mismatch)에 따른 필연적 경계선

분산 시스템의 여러 계층은 서로 본질적인 물리 법칙의 속도 차이를 지닌다.
Zenoh C-ABI 브릿지가 C에서 Go 영역으로 바이트 코드를 떠넘기는 속도는 초당 수백만 건, 즉 메모리 카피 수준의 레지스터 스피드(Nanoseconds)에 수렴한다. 반면 이 데이터를 수신받아 역직렬화(Deserialize)를 수행하고 외부 딥러닝 서버에 포스처(Posture) 추론 REST API를 요청한 다음 응답을 타임스케일(TimescaleDB) 쿼리로 적는 데는 마이크로초를 넘어 밀리초(Milliseconds) 대역의 긴 여정이 소모된다.

이 둘의 속도 차이는 수천 배에서 수만 배에 달한다. 파워 트레인(Power Train)의 기어비가 맞지 않으면 엔진이 폭발하듯, 수신 콜백(Subscriber Handler) 안에 이 연산 I/O를 직접 물려두면 찰나의 네트워크 패킷 인스턴스에 치명적인 배기구 병목(Backpressure)이 전이되어, C 엔진 단에서부터 커널 소켓 패킷 드롭(Drop) 사태로 역류한다. 엔지니어는 반드시 이 속도 격차의 골짜기에 ’완충 관문(Buffering Gate)’을 설치하여 양쪽의 도메인을 완전히 분리(Segregation)해야만 한다.

2. 채널(Channel)을 경계로 한 도메인 디커플링 아키텍처

파이프라인 분리의 핵심 교리는 “Zenoh가 지배하는 통신 도메인 구역 안에는 결단코 개발자의 사용자 비즈니스 시간(Time)이 스며들지 않게 하라“로 요약된다.

graph LR
    subgraph Zenoh Network Domain (Nanoseconds)
    A[Zenoh Router Mesh] -->|Zero-Copy| B(Subscriber Callback)
    B -->|Push Raw Bytes| C[(Network Buffer Channel)]
    end
    
    subgraph Sync/Parser Domain (Microseconds)
    C -->|Pop Array| D(JSON/Protobuf Parser)
    D -->|Push Object| E[(Compute Channel)]
    end
    
    subgraph I/O Bound Domain (Milliseconds)
    E -->|Route| F(Deep Learning Inference)
    E -->|Route| G(TimescaleDB Writer Pool)
    end

Go 언어의 특성상 이 완충 관어망은 Channel 로 치환된다.

  • 1차 경계(Network Buffer Channel): Zenoh 수신 단은 들어온 원시 객체(바이트 어레이와 토픽 스트링)의 1차원적 복사체만 구성하여 채널에 부어버리고 자신의 수명을 즉각 마감한다. 이곳이 속도 차이를 방어하는 최전선이다.
  • 2차 경계(Compute Channel): CPU 중심(CPU-bound) 연산인 정규식 파싱, 프로토콜 버퍼 추출만을 수행하는 제2의 스레드 풀 구역이다. 변환된 순수 객체만을 세 번째 터미널로 넘긴다.

비동기 채널 설계의 강제야말로, 특정 데이터베이스 노드의 가동이 일시 중단 되더라도 Zenoh 통신망 자체가 심정지(Halt)에 이르는 비극의 연대 책임을 무조건적으로 끊어 내는 최강의 방어막이다.

3. 캡슐화와 서브 시스템간 메시지 계약(Message Contract)

파이프라인을 엄격히 분리하게 되면 각 도메인은 상대방이 어떠한 스레드 체계로 동작하는지, GC 부하율이 몇 퍼센트인지 알 권리도 없고 알 필요도 없게 된다.
이러한 물리적 분리 철학을 Go 코드베이스의 디렉토리 구조(Layout)와 모듈 단위로도 승계하라.

  • module/network/zenoh_ingress.go: 이 파일에는 오직 zenoh.Sample 을 터치하는 외부 C-ABI 접점만이 존재한다. Go의 DB 드라이버나 비즈니스 객체 등은 일절 Import조차 금지되어야 한다.
  • 내부 서브 시스템이 소통할 때는 오직 시스템이 자체 합의한 중간 메시지 인터페이스(Message Contract, 예: 바이트스트림을 통일된 InternalFrame 구조체로 포장한 것)로만 대화해야 한다.

이러한 독립 분할 규약(Segregation)이 완성되었을 때, 향후 하드웨어 아키텍처가 업스케일되어 Kafka 노드가 추가되거나 Zenoh 엔진 코어가 마이너 업데이트 되더라도 각각의 스냅 컴포넌트들만 격리 상태에서 교체(Hot-Swap)할 수 있다는 무결점의 인프라 유연성이 확립된다.