- Non-Rust 서버(JavaScript, Python, Java 등)에서 점진적으로 Rust를 추가하는 전략 소개
- CPU 병목으로 인해 성능 요구 사항을 충족하지 못하는 핫 함수를 식별하고, Rust로 대체 구현하는 것이 목표
- 전략은 Tier(Rust 채택 수준)로 구분되며, Tier 0은 Rust 미사용, 마지막 Tier는 전체 서버를 Rust로 재작성
전략
Tier 0: Rust 미사용
- Node.js 서버에서 QR 코드 생성 엔드포인트 구현
- 기준 성능: 초당 1464 요청, 평균 지연 68ms, p99 지연 96ms, 평균 응답 크기 1506바이트, 메모리 1353MB
Tier 1: Rust CLI 도구
- QR 코드 생성 함수를 Rust로 재작성하고 CLI 도구로 컴파일
- 호스트 서버에서 CLI 도구 호출
- 기준 대비 성능: 초당 요청 1.76배 증가, 평균 지연 0.57배 감소, 평균 응답 크기 0.52배 감소, 메모리 0.92배 감소
Tier 2: Rust Wasm 모듈
- Rust 함수를 Wasm 모듈로 컴파일하고 호스트 서버에서 Wasm 런타임을 사용해 로드 및 실행
- Node.js 서버에는 wasm-bindgen 사용
- 기준 대비 성능: 초당 요청 2.03배 증가, 평균 지연 0.50배 감소
- 수동으로 Wasm 바인딩 작성하는 방법 설명 (다른 언어 사용자를 위해)
Tier 3: Rust 네이티브 함수
- Rust로 함수 작성, 네이티브 코드로 컴파일, 호스트 런타임에서 로드 및 실행
- Node.js에는 napi-rs 사용
- 기준 대비 성능: 초당 요청 3.75배 증가, 평균 지연 0.26배 감소
Tier 4: Rust 재작성
- 호스트 서버 전체를 Rust로 재작성
- 실제로는 호스트 서버 일부만 재작성하는 것이 현실적
- 기준 대비 성능: 초당 요청 4.93배 증가, 평균 지연 0.21배 감소, 메모리 0.01배 감소 (13MB 사용)
결론
- 모든 전략이 좋지만, Tier 3이 가장 효과적
- 오프더셸프 바인딩 생성기 라이브러리를 사용할 수 있다면 Rust로 네이티브 함수 작성이 쉬우며 성능에 큰 영향