하이퍼레이인 프레임워크를 통한 분산 시스템 프로젝트 경험
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- 분야: Rust 언어 및 웹 프레임워크 개발자
- 난이도: 중급(아син크/await, 라우팅, 미들웨어 이해 필요)
핵심 요약
- 성능 우수성:
Hyperlane
은Tokio
기반 비동기 아키텍처로 324,323 QPS 기록 (Go의 Gin 대비 26% 성능 향상) - 디자인 패턴: 체인식 메서드 호출(
ctx.get_request_method().await
)과 온리온 모델 미들웨어 시스템 제공 - 버전 관리 주의사항:
v4.89+
에서ctx.aborted().await
API 변경으로 CHANGELOG 필수 확인
섹션별 세부 요약
1. 프레임워크 도입 배경
- 성능 지표: "High-performance, lightweight" 설계 원칙
- 의존성 설정:
Cargo.toml
에hyperlane = "5.25.1"
명시 - 비교 대상: Rocket, Gin, Express 등 기존 프레임워크 대비 성능 우수
2. 핵심 API 활용
- Context 설계:
- ctx.get_request_method().await
로 요청 메서드 추출 (기존 get_method()
대비 간결)
- request.method
→ get_request_method()
자동 매핑
- REST API 구현:
- async fn delete_user(ctx: Context)
등 비동기 핸들러 사용
- hyperlane
제공 메서드 매크로 활용
3. 주요 실무 문제점
- 아син크 키워드 누락:
async
생략 시 컴파일러 오류 발생 (Rust의 비동기 템플릿 특성) - 정규표현식 라우팅:
/user/{id:\d+}
사용 시 원시 문자열 리터럴(raw string) 필요 (r"/user/{id:\d+}"
)
4. 응답 처리 API
| 연산 유형 | 예시 코드 | 목적 |
|---|---|---|
| 응답 추출 | ctx.get_response().await
| 전체 응답 객체 획득 |
| 상태 코드 설정 | ctx.set_response_status_code(404).await
| 404 상태 설정 |
| 연결 유지 응답 | ctx.set_response_body("Data").send().await
| 연결 유지 후 응답 전송 |
| 즉시 종료 | ctx.set_response_body("Bye").send_once().await
| TCP 연결 종료 |
5. 미들웨어 시스템
- 워크플로우:
Request
→ Middleware 1
→ Middleware 2
→ Controller
→ Middleware 3
→ Middleware 4
→ Response
- 로깅 미들웨어 예시:
```rust
async fn log_middleware(ctx: Context, next: Next) {
let start = Instant::now();
next.run(ctx).await;
println!("<- {}ms", start.elapsed().as_millis());
}
```
6. 버전 관리 및 진화
- v4.89+ 변경 사항:
- ctx.aborted().await
API 도입 (요청 중단)
- 미들웨어 실행 순서 변경 (CHANGELOG 필수 확인)
- 버전 진화 다이어그램:
```mermaid
graph TD
v3[3.0.0] -->|Middleware before routing| v4[4.0.0]
v4 -->|Separate request/response middleware| v4_22[4.22.0]
v4_22 -->|Add aborted| v4_89[4.89.0]
v4_89 -->|Add closed| v5_25[5.25.1]
```
7. 성능 테스트 결과
- wrk 테스트 환경: AWS t2.micro 인스턴스
- QPS 비교:
- Hyperlane: 324,323
- Rocket: 298,945
- Gin (Go): 242,570
- Express: 139,412
결론
- 실무 팁:
- Cargo.toml
에서 버전 고정 ("5.25.1"
) 필수
- 비동기 핸들러에 async
키워드 누락 주의
- send()
과 send_once()
의 TCP 연결 유지 여부 차이 명확히 이해
- 성능 비결:
Tokio
기반 비동기 처리 및 zero-copy 기술 활용 - 향후 계획: WebSocket 기반 실시간 로깅 시스템 구현 예정