Rust Workers의 안정성 대폭 강화: 패닉/중단 복구 메커니즘 도입

by DD
1개월 전
조회수 38

Cloudflare Workers에서 Rust를 WebAssembly로 컴파일하여 실행 시, 패닉(Panic) 또는 중단(Abort) 발생 시 샌드박스(Sandbox)가 손상되는 문제 발생

wasm-bindgen의 패닉=unwind 지원 및 중단 복구 메커니즘 도입을 통해 단일 요청 실패가 다른 요청에 영향을 미치는 문제 해결

WebAssembly Exception Handling(Wasm 예외 처리)을 활용하여 Rust 코드의 안정성(Stability)을 향상시키고, Durable Objects와 같은 상태 보존 워크로드(Workload) 지원

wasm-bindgen에 --reset-state-function 추가하여 Wasm 라이브러리(Library)의 자동 중단 복구 지원

패닉=unwind를 위한 WebAssembly Exception Handling

본문에서는 Rust Workers에서 패닉(Panic) 발생 시 인스턴스(Instance) 상태를 유지하기 위해 WebAssembly Exception Handling(Wasm 예외 처리)을 활용하는 방법을 설명한다. 기존에는 panic=abort로 인해 패닉 발생 시 Wasm 인스턴스가 종료되었지만, 이제 RUSTFLAGS='-Cpanic=unwind'를 사용하여 unwind 지원(Unwind Support)을 활성화한다.

try/catch 블록(Block) 지원: Walrus 파서(Parser)에 try/catch 구문 추가

extern "C-unwind" 사용: Rust-JavaScript 경계에서 패닉을 감지하고 JavaScript PanicError 예외로 처리

Closure::new_aborting: Unwind 안전성(Unwind Safety)을 보장할 수 없는 경우, 패닉 발생 시 종료되도록 설정

이러한 변경을 통해 패닉 발생 시에도 WebAssembly 인스턴스(Instance)의 재사용(Reusability)이 가능해졌다.

중단(Abort) 복구를 위한 wasm-bindgen 개선

패닉=unwind 지원에도 불구하고, 메모리 부족(Out-of-memory)과 같은 이유로 중단(Abort)은 여전히 발생할 수 있다. 중단은 unwinding을 지원하지 않으므로, 상태 복구가 불가능하다. 따라서, wasm-bindgen은 중단 발생을 감지하고, 이후 연산이 성공하도록 보장하는 메커니즘을 도입했다.

Exception.Tag 기능: WebAssembly Exception Handling(Wasm 예외 처리)의 Exception.Tag 기능을 활용하여, 복구 가능한 오류와 그렇지 않은 오류를 구분

set_on_abort 훅(Hook): 초기화 시 중단 핸들러(Handler)를 연결하여 플랫폼의 요구 사항에 따라 복구 수행

재진입 방지(Reentrancy Guard): 중단 발생 시, 재진입을 방지하여 예측 불가능한 동작(Undefined Behavior) 방지

이러한 개선을 통해, 중단 발생 시에도 실행 정확성(Execution Correctness)을 보장하고, 단일 실패가 연쇄적인 실패로 이어지는 것을 방지한다.

Wasm 라이브러리(Library)를 위한 자동 중단 복구

Cloudflare는 JS 기반 Workers 사용자를 위해 wasm-bindgen을 사용하는 Wasm 라이브러리(Library)의 중단(Abort) 복구 문제를 해결하고자 했다. 이를 위해 --reset-state-function을 도입하여, Wasm 라이브러리가 자체적으로 내부 Wasm 인스턴스를 초기 상태로 되돌릴 수 있도록 지원한다.

--reset-state-function: Wasm 인스턴스(Instance)를 초기 상태로 리셋(Reset)하는 기능 제공

클래스 인스턴스(Class Instance) 처리: 이전 인스턴스에서 생성된 클래스 인스턴스는 예외 발생, 새로운 클래스 인스턴스 생성 가능

JS 애플리케이션(Application) 영향: Wasm 라이브러리를 사용하는 JS 애플리케이션은 오류 발생, 하지만 브릭(Brick)되지 않음

이러한 기능을 통해, Wasm 라이브러리 사용자는 별도의 재임포트(Reimport) 없이 중단으로부터 복구할 수 있다.

Rust Wasm Exception Handling 생태계 성숙

Cloudflare는 wasm-bindgen 프로젝트뿐만 아니라, Rust의 Wasm 지원을 개선하기 위해 노력했다. 특히, panic=unwind를 사용하기 위해서는 실험적인 nightly Rust target이 필요했기에, WebAssembly Exception Handling(Wasm 예외 처리)을 위한 Rust 지원을 안정화하는 데 기여했다.

Legacy vs Modern Exception Handling: WebAssembly Exception Handling(Wasm 예외 처리)의 두 가지 변형(Legacy, Modern) 존재

Node.js 24 지원: Node.js 24 LTS 릴리스(Release)에 Modern Exception Handling을 백포팅(Backporting)하여, 생태계 전반의 호환성 확보

향후 계획: panic=unwind 및 Modern Exception Handling을 안정화하여, 사용자 경험을 개선할 예정

이러한 장기적인 투자를 통해, Rust WebAssembly 커뮤니티(Community)의 강력한 기반(Strong Foundation)을 구축하고 있다.

Rust Workers에서 panic=unwind 사용

Rust Workers 0.8.0 버전부터 --panic-unwind 플래그(Flag)를 사용하여 패닉(Panic)을 완전히 복구하고, 중단(Abort) 복구를 위한 새로운 메커니즘을 사용할 수 있다. 이는 Rust Workers의 안정성을 크게 향상시키는 데 기여한다.

--panic-unwind 플래그: 빌드(Build) 시 추가하여 패닉 복구 활성화

이전 버전과의 호환성: panic=abort를 사용하는 경우, 이전 커스텀(Custom) 복구 래퍼(Wrapper)를 계속 사용

권장 사항: 최신 버전으로 업그레이드하여, 보다 안정적인 Rust Workers 경험을 얻을 수 있음

이러한 노력을 통해, Cloudflare는 Rust Workers의 안정적인 릴리스(Stable Release)를 위해 지속적으로 노력하고 있다.

Making Rust Workers reliable: panic and abort recovery in wasm‑bindgen