Files
grpc_performance_comparison/TO-DO.md
T

158 lines
6.1 KiB
Markdown

# TO-DO.md — 추후 개발 항목
> 본 파일은 ARCHITECTURE.md와 CLAUDE.md 등에 정의되었으나 **아직 구현되지 않은** 항목들을 추적한다.
> Phase 0 (데모 UI)는 완료되었으며, Phase 1부터 순차적으로 진행 예정이다.
---
## 1. 서버·전송 계층 구현 (Phase 1)
### 1.1. Proto 정의 및 코드 생성
- `proto/aiot/inference/inference.proto` — AI 추론 요청/응답
- `proto/aiot/device/device.proto` — 디바이스 등록·상태 보고
- `proto/aiot/gateway/gateway.proto` — 게이트웨이 데이터 전달 서비스
- `make proto` — protoc + protoc-gen-go + protoc-gen-go-grpc 설치 및 자동화
### 1.2. 전송 계층 (`internal/transport/`)
- `transport.go` — Listener/Dialer 인터페이스 정의
- `h2_listener.go` — HTTP/2 (TCP) 리스너
- `quic_listener.go` — QUIC 리스너 (quic-go 래핑)
- `quic_dialer.go` — QUIC 클라이언트 다이얼러
- **리스크**: quic-go `quic.Stream``net.Conn` 인터페이스 호환성 검증 필요
### 1.3. 서버 구현 (`internal/server/`, `cmd/server/`)
- `internal/server/inference_server.go` — InferenceService 구현
- `internal/server/device_server.go` — DeviceRegistry 구현
- `internal/server/gateway_server.go` — GatewayService 구현
- `cmd/server/main.go``--transport=quic|h2` 플래그 기반 진입점
### 1.4. 클라이언트 구현 (`internal/client/`)
- `internal/client/inference_client.go` — gRPC 클라이언트 (재시도·타임아웃)
- `internal/client/rest_client.go` — REST 비교군 클라이언트
### 1.5. 미들웨어 (`internal/middleware/`)
- `logging.go` — 요청/응답 로깅 인터셉터
- `metrics.go` — latency 측정 인터셉터
---
## 2. REST 비교군 구현 (Phase 1)
### 2.1. REST 서버
- `cmd/rest-server/main.go` — HTTP/1.1 + JSON REST API 서버
- `--edge` 플래그 지원 (REST-Edge, 엣지 ROI 1차 처리)
### 2.2. REST 클라이언트
- `rest_client.go` — gRPC 클라이언트와 동일 시나리오 보장
---
## 3. 게이트웨이 구현 (Phase 2~3)
### 3.1. 게이트웨이 코어 (`internal/gateway/`)
- `gateway.go` — 라우팅·변환 엔진
- `protocol_adapter.go` — IoT 프로토콜 어댑터 인터페이스
- `mqtt_adapter.go` — MQTT → Protobuf 변환
- `coap_adapter.go` — CoAP → Protobuf 변환 (P1)
- `route_table.go` — 서비스 디스커버리·라우팅 테이블 (YAML 기반)
### 3.2. 라우터 (`internal/router/`)
- `task_router.go` — 엣지 라우팅 로직 (ROI 결과 기반)
### 3.3. 게이트웨이 서버
- `cmd/gateway/main.go` — 게이트웨이 진입점
- HTTP/2 fallback 모드 지원 (quic-go 리스크 대비)
---
## 4. 스크립트·빌드 인프라
### 4.1. Shell 스크립트 (`scripts/`)
- `proto-gen.sh` — protoc 컴파일 자동화
- `tc-setup.sh``--delay --loss --rate --interface` 옵션 지원
- `tc-reset.sh` — tc 설정 초기화
### 4.2. Docker (`docker/`)
- `Dockerfile.server` — gRPC 서버 컨테이너
- `Dockerfile.rest-server` — REST 서버 컨테이너
- `docker-compose.yml` — 전체 실험 환경 구성
### 4.3. Makefile (루트)
- `make proto`, `make build`, `make run-server`, `make test`
- `make benchmark`, `make lint`, `make docker-up/down`, `make clean`
### 4.4. Lint 설정
- `.golangci-lint.yaml` — errcheck, govet, staticcheck 등
### 4.5. `go.mod` / `go.sum` (루트)
- 루트 Go 모듈 초기화 (`src/`와 별도)
---
## 5. 벤치마크 (Phase 2~3)
### 5.1. 벤치마크 러너 CLI
- `cmd/benchmark-runner/main.go``--mode=once|matrix --scenario --transport`
- 분산 환경 end-to-end 측정 (P50/P95/P99, RPS)
- 2모드: 단일 측정(`once`) / 전체 매트릭스 sweep(`matrix`)
### 5.2. Go testing.B 벤치마크 (`benchmarks/scenarios/`)
- `unary_test.go` — Unary RPC 마이크로벤치마크
- `streaming_test.go` — Streaming RPC 벤치마크
- `rest_compare_test.go` — REST vs gRPC 비교
- 역할: 단일 프로세스 내 직렬화 시간·처리량 측정 (benchmark-runner와 분리)
### 5.3. 실험 결과 저장소
- `benchmarks/results/YYYY-MM-DD/*.json` — raw latency + 메타데이터
- 사후 분석: percentile + CI95 + Tukey outlier + Mann-Whitney U
---
## 6. 문서·설계 결정
### 6.1. ADR (Architecture Decision Records)
`docs/decisions/` 디렉터리에 다음 ADR 작성 필요:
- `001-go-grpc-baseline.md` — Go + gRPC 기술 스택 선정 배경
- `002-quic-grpc-compatibility-poc.md` — quic-go 호환성 검증 결과
- `003-gateway-architecture.md` — 게이트웨이 아키텍처 및 novelty 정의
- `004-protocol-adapter-design.md` — MQTT/CoAP 변환 전략
- `005-routing-data-model.md` — 라우팅 데이터 모델 및 설정 형식
- `006-experiment-design.md` — 실험 매트릭스·워크로드 파라미터 고정
### 6.2. 위험 관리 (`docs/risks.md`)
- quic-go 호환성 (R-01)
- Docker tc 미작동 (R-02)
- MQTT/CoAP 범위 과다 (R-03)
- Go 버전업 호환성 (R-04)
- 합성 부하의 한계 (R-05)
---
## 7. Phase 0 UI — 사소한 개선
### 7.1. `types.go` — 6개 시스템 확장 (낮은 우선순위)
- REST-Cloud / REST-Edge / gRPC-H3-Stream / gRPC-H3-GW 추가
- **메인 비교 대상은 REST-H2 / gRPC-H2 / gRPC-H3 3개**이므로 시급하지 않음
### 7.2. `Result.Latencies` RingBuffer 전환 (선택)
- 타입 레벨에서 cap을 명시하거나 RingBuffer로 변경
- 현재는 simulator.go에서 500개로 제한 중
### 7.3. `padVisible()` 개선 (선택)
- `runewidth.StringWidth()` 사용하여 한글 정렬 보정
- (`mattn/go-runewidth`는 이미 간접 의존성에 존재)
---
## Phase별 요약
| Phase | 주요 작업 | 의존성 |
|-------|---------|--------|
| **1** | Proto 정의 + 전송 계층 + gRPC 서버/클라이언트 + REST 비교군 | — |
| **2** | 게이트웨이 + MQTT 어댑터 + 라우팅 | Phase 1 완료 |
| **3** | tc 스크립트 + Docker + 벤치마크 러너 | Phase 1 완료 |
| **4** | Mininet 토폴로지 + 다중 컨테이너 부하 | Phase 3 완료 |
| **5** | simulator 실측 교체 + 0-RTT/HoL 측정 | Phase 3~4 완료 |
> 상세 우선순위는 `TASK_LIST.md`를, 의존 순서는 `IMPLEMENTATION.md` §6.2를 참조한다.