IndustrialUpdated 2025-04-01

gRPC Streaming

단방향 단순 호출을 넘어 — 실시간 IoT·로봇 제어를 위한 스트리밍 아키텍처

ESP32-S3PlatformIOFreeRTOS

1. 개념 (Concept)

1.1 gRPC란?

gRPC는 Google이 개발한 고성능 오픈소스 RPC(Remote Procedure Call) 프레임워크다. HTTP/2 + Protocol Buffers를 기반으로 언어 간 타입 안전 통신을 제공한다.

Protocol Buffers (.proto) → 코드 자동 생성 → 타입 안전 RPC 호출

1.2 gRPC vs REST vs MQTT 비교

항목REST (HTTP/1.1)MQTTgRPC (HTTP/2)
프로토콜텍스트 (JSON)바이너리바이너리 (Protobuf)
스트리밍불가 (SSE 제한적)Pub/Sub완전한 양방향
연결요청마다 재연결영구 연결영구 연결 (멀티플렉싱)
타입 안전없음없음스키마 강제
브라우저 지원완전불가gRPC-Web 필요
MCU 적합성보통최적무거움
서버간 통신보통보통최적
지연시간높음낮음매우 낮음

1.3 스트리밍 4가지 패턴


2. 상세 내용 (Details)

2.1 HTTP/2 멀티플렉싱 구조

gRPC가 빠른 핵심 이유 — HTTP/1.1의 Head-of-Line Blocking 제거.

2.2 gRPC 프레임 구조 (Wire Format)

┌─────────────────────────────────────────────────────┐ │ gRPC 데이터 프레임 (5-byte 헤더 + Protobuf payload) │ ├──────┬──────────────────────────────────────────────┤ │ [0] │ Compressed-Flag (0 = 비압축, 1 = gzip) │ │[1-4] │ Message Length (uint32, big-endian) │ │[5..] │ Protobuf 직렬화 데이터 │ └──────┴──────────────────────────────────────────────┘

2.3 Protocol Buffers 타입 시스템

2.4 CtrlPlus Proto 정의 예시

protobuf

2.5 gRPC-Web 변환 구조 (브라우저 지원)

브라우저는 HTTP/2 Trailer 헤더에 직접 접근 불가 → Envoy가 변환.

2.6 Trailer 인코딩 원리

gRPC-Web Trailer Frame: [0] = 0x80 (1 << 7 = Trailer flag) [1-4] = trailer 길이 [5..] = "grpc-status:0\r\ngrpc-message:\r\n"

3. 구조 설명 (Architecture)

3.1 CtrlPlus 전체 통신 아키텍처

3.2 Server Streaming 상세 플로우

3.3 Bidirectional Streaming 상세 플로우

3.4 MQTT-gRPC Bridge 구조

3.5 Interceptor 체인 구조

3.6 Go 서버 상태 머신

3.7 Envoy 설정 구조


4. 응용 (Applications)

4.1 스트리밍 패턴 × CtrlPlus 적용 맵

4.2 시나리오별 스트리밍 선택 기준

4.3 ESP32-S3 ↔ Go Bridge 연동 흐름

4.4 gRPC 오류 코드 대응표

코드이름상황대응
0OK성공
1CANCELLED클라이언트가 취소정상 처리
2UNKNOWN알 수 없는 오류서버 로그 확인
4DEADLINE_EXCEEDED타임아웃 초과재시도 or 타임아웃 증가
5NOT_FOUND리소스 없음디바이스 ID 확인
7PERMISSION_DENIED권한 없음JWT 권한 확인
8RESOURCE_EXHAUSTEDRate Limit 초과Backoff 재시도
10ABORTED트랜잭션 충돌재시도
13INTERNAL서버 내부 오류서버 로그 확인
14UNAVAILABLE서버 불가재연결 (Backoff)
16UNAUTHENTICATED인증 실패JWT 갱신

4.5 Next.js 클라이언트 구현 패턴

typescript

4.6 Go 서버 BiDi 스트리밍 구현 핵심

Go

4.7 배포 구조 (CtrlPlus VPS)

4.8 트러블슈팅 플로우


부록. 빠른 참조

Proto 서비스 패턴 치트시트

// Unary rpc GetStatus(DeviceId) returns (DeviceStatus); // Server Streaming rpc Subscribe(SubscribeReq) returns (stream SensorData); // Client Streaming rpc UploadBatch(stream SensorData) returns (BatchResult); // Bidirectional Streaming rpc ControlLoop(stream SensorData) returns (stream ControlCommand);

grpcurl 테스트 명령

Bash

스트리밍 타입 × 적합 시나리오

패턴CtrlFarmCtrlFactoryCtrlMotion
Unary밸브 개폐, 파라미터 설정액추에이터 명령단발 관절 이동
Server Stream센서 대시보드, 알람공정 모니터링로봇 상태 시각화
Client Stream재연결 버퍼 업로드생산 로그 배치경로 계획 업로드
BiDi Stream실시간 공정 피드백PID 제어 루프