하이퍼레인: 루스트 웹 프레임워크의 성능과 사용법
프로그래밍/소프트웨어 개발
웹 개발
대상자
- 대상자: 웹 개발자, Rust 언어를 사용하는 개발자, 고성능 웹 서비스 개발에 관심 있는 프로그래머
- 난이도: 중간 수준 (Rust 언어 기본 지식을 가정)
핵심 요약
hyperlane
은 Rust로 작성된 고성능 웹 프레임워크로, wrk 테스트에서 120,000+ QPS 성능을 기록함Context
추상화를 통해 요청 메서드를 간단하게 가져올 수 있으며,?
연산자와 유사한 메서드 체이닝 제공send()
와send_once()
는 TCP 연결 유지 여부에 따라 다른 동작을 수행하며, 중요한 프레임워크 개념
섹션별 세부 요약
1. 하이퍼레인 소개 및 성능
- 하이퍼레인은 Rust 기반의 고성능, 가벼운 웹 프레임워크로, zero platform dependency 제공
wrk
테스트에서 Hyperlane: 120,000+ QPS, actix-web: 90,000+ QPS, axum: 80,000+ QPS 성능 비교Cargo.toml
에hyperlane = "5.25.1"
추가하여 사용
2. `Context` 추상화 및 메서드 사용
- 전통적인 웹 프레임워크에서 요청 메서드를 얻는 방법:
```rust
let method = ctx.get_request().await.get_method();
```
- 하이퍼레인에서는 간결한 방식으로 제공:
```rust
let method = ctx.get_request_method().await;
```
get_request_method()
메서드는request.method
를 자동으로 매핑하여 제공
3. RESTful API 구현 및 메서드 매크로
async fn user_api(ctx: Context)
과 같이 RESTful API 구현 가능delete_user
함수는 DELETE 요청을 처리하는 데 사용- 메서드 매크로를 활용하여 GET, POST, DELETE 요청 처리 가능
4. `async` 키워드 누락 문제
async
키워드를 빠뜨린 경우 컴파일러 오류 발생- Rust의 비동기 프로그래밍은 세부 사항에 대한 주의가 필요
5. 응답 API 및 비교 표
- 응답 객체 가져오기:
let res: Response = ctx.get_response().await;
- 상태 코드 설정:
ctx.set_response_status_code(404).await;
- 응답 전송:
ctx.set_response_body("Data").send().await;
- 즉시 종료:
ctx.set_response_body("Bye").send_once().await;
send()
vssend_once()
: TCP 연결 유지 여부에 따라 동작 차이
6. 미들웨어 워크플로우 (온리온 모델)
- 요청 흐름:
- Request → Middleware 1 (Outer Layer) → Middleware 2 (Inner Layer) → Controller/Route Handler
- Response 흐름: Controller → Middleware 2 (Response Flow) → Middleware 1 (Response Flow) → Response
- 미들웨어 워크플로우는 "온리온 모델"로 설명됨
7. 로깅 미들웨어 구현 예시
log_middleware
예시 코드:
```rust
async fn log_middleware(ctx: Context, next: Next) {
let start_time = Instant::now();
println!("Request started at: {:?}", start_time);
next.await;
println!("Request finished at: {:?}", start_time.elapsed());
}
```
결론
- 하이퍼레인 프레임워크는 Rust 기반의 고성능 웹 프레임워크로, 간결한 API와 강력한 성능을 제공
Context
추상화와send()
/send_once()
메서드는 중요한 개념이며, 비동기 프로그래밍을 사용하는 데 주의가 필요- 미들웨어 워크플로우를 이해하고, RESTful API와 응답 메서드를 잘 활용해야 실무에서 효과적으로 사용 가능