AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

하이퍼레이인 프레임워크를 통한 분산 시스템 프로젝트 경험

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

  • 분야: Rust 언어 및 웹 프레임워크 개발자
  • 난이도: 중급(아син크/await, 라우팅, 미들웨어 이해 필요)

핵심 요약

  • 성능 우수성: HyperlaneTokio 기반 비동기 아키텍처로 324,323 QPS 기록 (Go의 Gin 대비 26% 성능 향상)
  • 디자인 패턴: 체인식 메서드 호출(ctx.get_request_method().await)과 온리온 모델 미들웨어 시스템 제공
  • 버전 관리 주의사항: v4.89+에서 ctx.aborted().await API 변경으로 CHANGELOG 필수 확인

섹션별 세부 요약

1. 프레임워크 도입 배경

  • 성능 지표: "High-performance, lightweight" 설계 원칙
  • 의존성 설정: Cargo.tomlhyperlane = "5.25.1" 명시
  • 비교 대상: Rocket, Gin, Express 등 기존 프레임워크 대비 성능 우수

2. 핵심 API 활용

  • Context 설계:

- ctx.get_request_method().await로 요청 메서드 추출 (기존 get_method() 대비 간결)

- request.methodget_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. 미들웨어 시스템

  • 워크플로우:

RequestMiddleware 1Middleware 2ControllerMiddleware 3Middleware 4Response

  • 로깅 미들웨어 예시:

```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 기반 실시간 로깅 시스템 구현 예정