Production Stability
Cold-start · soak · cross‑framework 비교
Akan.js는 빠르기만 한 게 아니라 프로덕션급입니다
Apple Silicon에서 Akan.js와 다섯 개의 동급 프레임워크를 30분 production 스타일 soak로 테스트했습니다. 결과: Akan.js는 가장 빠른 Bun 네이티브 라우터와 동등한 처리량을 보이면서 전체 실행 동안 안정적이고, 재시작 없이, 메모리 안전하게 유지되었습니다.
측정 방법
워크로드
Pure HTTP ping (DB 없음, 인증 없음) — 모든 프레임워크가 측정되는 경량 라우터 상한선입니다.
아티팩트
사전 빌드된 production JS 번들. 모든 타겟에서 빌드 및 TypeScript 로더 시간을 제외하고 프로세스 spawn부터 first‑ready까지 측정했습니다.
지속 시간
타겟당 30분, 50 concurrent virtual users, 10초 warm‑up. 5초마다 리소스 샘플링.
머신
Apple Silicon MacBook Pro. Bun 네이티브 타겟은 Bun 1.3, Fastify는 Node 22에서 실행. 실행 중 백그라운드 작업 최소화.
경량 라우터 상한선에서의 처리량
Akan.js는 게이트웨이-워커 경로를 통해 초당 112K 요청을 처리합니다. raw Bun.serve의 3% 이내이며 ElysiaJS와 거의 동등합니다. 상위 4개 Bun 네이티브 프레임워크가 서로 10% 이내에 모여 있어, 이 워크로드에서는 런타임 상한선이 프레임워크 선택보다 더 중요함을 보여줍니다.
초당 요청 수
막대는 세트 내 최고 RPS에 비례합니다. Fastify는 Node에서 실행되며, 그 수치는 프레임워크뿐 아니라 런타임 차이도 일부 반영합니다.
콜드 스타트와 idle 메모리
Akan.js 콜드 스타트 p50은 약 204ms로, 단일 프로세스 동료보다 약 100ms 느립니다. 이는 게이트웨이와 워커 프로세스를 spawn하는 일회성 비용입니다. 요청당 지연에는 영향을 주지 않으며 1,500ms SLO 안에 여유 있게 들어옵니다.
| 타겟 | Cold p50 | Cold p95 | Idle RSS |
|---|---|---|---|
| raw Bun.serve(Bun) | 102.5 ms | ~108 ms | 45.6 MB |
| ElysiaJS(Bun) | 104.3 ms | ~109 ms | 53 MB |
| Akan.js(Bun) | 203.6 ms | ~209 ms | 84 MB |
| Hono(Bun) | 104 ms | ~109 ms | 47.1 MB |
| raw sqlite(Bun) | 102.4 ms | ~107 ms | 49.6 MB |
| Fastify(Node) | 103.8 ms | ~109 ms | 64.3 MB |
타겟당 10회 반복, 실행 간 60초 settle. Akan.js 콜드 스타트는 /_akan/app/health ready‑child 체크를 사용하며, 동료 프레임워크는 HTTP ping을 사용합니다.
Soak 안정성: 프로덕션에서 중요한 지표
50 concurrent users로 30분 지속 부하. 오류 0, 워커 재시작 0, RSC 재사용 0, 이벤트 루프 지연 4ms 이하. 6개 프레임워크 모두 통과했지만, Akan.js만 빌트인 /_akan/app/metrics 엔드포인트를 통해 이 메트릭을 네이티브로 보고할 수 있습니다.
| 지표 | Akan.js | 전체 프레임워크 |
|---|---|---|
| 30분 soak 오류율 | 0.0% | 0.0% |
| 워커 재시작 | 0 | — |
| RSC 워커 재사용 | 0 | — |
| 이벤트 루프 지연 p99 | 3.78 ms | — |
| 시간당 메모리 증가 | −120.5 MB/h (stable) | All frameworks showed negative or near-zero growth. |
숫자가 다른 이유 — 그리고 괜찮은 이유
게이트웨이+워커 아키텍처
Akan.js는 게이트웨이 프로세스가 하위 워커 프로세스로 프록시하는 구조입니다. 이 덕분에 인프라 코드를 한 줄도 작성하기 전에 자동 프로세스 격리, 헬스 체크, graceful restart, 워커별 메트릭을 얻습니다. 비용은 단일 프로세스 서버 대비 약 100ms의 콜드스타트 오버헤드입니다. 이 100ms는 요청당 지연이 아니며, 시작 시 한 번만 지불되고 지속 트래픽 아래에서는 완전히 사라집니다.
라우터가 아닌 풀스택 런타임
이 비교에 등장한 동료들은 인메모리 데이터를 가진 HTTP 라우터입니다. Akan.js는 guards와 직렬화를 포함한 Signal 컨텍스트, DataLoader 배치를 포함한 document store, SSR/RSC 워커 파이프라인, WebSocket pubsub, 메트릭 엔드포인트까지 전체 애플리케이션 스택을 로드합니다. 이 풀스택 부하 아래에서도 raw Bun.serve의 3% 이내에 머문다는 것이 진짜 이야기입니다.
더 무거운 idle 메모리는 예상 가능하고 제한적입니다
Akan.js의 idle RSS(~84 MB)는 최소 라우터의 약 1.8배입니다. 이는 애플리케이션이 실제로 필요로 하는 로드된 서비스 모듈, 스키마 레지스트리, 워커 스캐폴딩을 반영합니다. 중요한 것은 30분 soak에서 메모리 크립이 전혀 없다는 점입니다. 증가 기울기는 음수이고 피크 RSS는 안정화되었습니다. 프로덕션에서 중요한 것은 시작 시점의 절대 숫자가 아니라 지속 부하 아래에서도 평평하게 유지되는 메모리 프로필입니다.
결론
Akan.js는 합성 ping 벤치마크에서 가장 빠른 HTTP 프레임워크가 아닙니다. 그래서도 안 됩니다. 게이트웨이-워커 아키텍처를 실행하고 전체 풀스택 런타임을 로드하면서도 Bun 네이티브 상한선과 구분할 수 없는 처리량을 제공합니다.
