Cloudflare는 wasm-bindgen 도구 체인과 Rust Workers 환경에 컴파일 타깃 wasm32-unknown-emscripten을 지원하는 첫 번째 공개 실험 미리 보기를 발표했다. 이 경로를 사용하면 기존 WebAssembly 모델과 사전에 호환되는 라이브러리로 제한되지 않고, 더 많은 네이티브 Rust 애플리케이션과 라이브러리를 WebAssembly 형식으로 빌드해 전 세계 Workers 플랫폼에서 실행할 수 있다.
이 작업은 네이티브 코드를 웹 환경에 연결하고 파일 시스템, 타이머, 소켓과 같은 기능을 에뮬레이션하는 계층을 제공하는 Emscripten과 Rust와 JavaScript 사이의 바인딩을 생성하는 wasm-bindgen을 통합한다. 새로운 변경 사항에 따라 Rust 컴파일러와 Emscripten 컴파일러는 동일한 빌드 과정에서 서로의 바인딩 계층을 사용할 수 있다.
Rust 라이브러리 호환성 확대
Cloudflare에 따르면 초기 테스트에서는 저수준 라이브러리를 포함한 Rust 라이브러리와의 호환성이 향상된 것으로 나타났다. libc, socket2, Mio와 같은 라이브러리는 플랫폼 조건에 Emscripten 타깃을 추가하기 위해 제한적인 수정이 필요했다. 가장 복잡한 라이브러리는 Tokio였다. Workers는 JavaScript 이벤트 루프 안에서 단일 스레드로 실행되는 반면, Tokio는 전통적으로 입출력 작업을 기다리는 동안 스레드를 차단하는 방식에 의존하기 때문이다.
이 차이를 해결하기 위해 Cloudflare는 두 가지 경로를 추진하고 있다. 첫 번째는 WebAssembly JavaScript Promise Integration을 사용하는 방식으로, WebAssembly 스택을 일시 중지하고 제어권을 JavaScript 이벤트 루프로 돌려보낼 수 있다. 이를 위해서는 스택을 일시 중지하고 재개할 때 스레드 로컬 컨텍스트를 정밀하게 관리해야 한다. 두 번째 경로는 Tokio에 LocalEventLoop 패턴을 제안하는 방식이다. 여기서는 준비된 작업을 drive() 작업을 통해 실행하고, 대기는 호스트 이벤트 루프에 알림 신호를 보내는 방식으로 대체한다.
소켓 및 TCP 네트워크 지원
Tokio가 Mio를 통해 epoll_wait()에 의존하는 반면, Emscripten은 poll()에 대한 제한적인 지원과 WebSocket을 에뮬레이션하는 계층만 제공했기 때문에 네트워크 지원은 추가적인 과제였다. 이에 따라 Cloudflare는 Emscripten에 40개가 넘는 병합 요청을 기여해 node:net 인터페이스를 통해 epoll, TCP, UDP 및 Unix 소켓을 지원하는 -sNODERAWSOCKETS 계층을 추가했다.
Workers는 Node.js 인터페이스와의 호환성을 제공하므로 Emscripten과 Cloudflare 사이에 별도의 전용 인터페이스를 추가하지 않고도 플랫폼 내부에서 동일한 브리지를 사용할 수 있다. 이러한 기능은 여전히 실험 단계이며, 일부 Tokio 패치는 프로젝트에 최종적으로 병합되기 전에 아직 검토 중이다.
Minecraft 서버를 통한 실용적 테스트
호환성 수준을 테스트하기 위해 Cloudflare 엔지니어 Dan Lapid는 Pumpkin으로 알려진 Rust로 작성된 Minecraft 서버를 Durable Object 내부에서 실행했다. Durable Object가 단일 스레드로 작동하기 때문에 게임 루프, 청크 스케줄링 및 Rayon 작업을 독립적인 운영 체제 스레드에 의존하는 대신 Tokio 루프 안의 협력적 작업으로 전환했다.
서버는 Node.js 인터페이스를 통해 파일 시스템을 사용했으며, worker-fs-mount 라이브러리를 통해 Durable Object의 SQLite에 파일을 저장했다. 또한 플레이어 연결은 TCP ingress를 거쳐 객체 내부의 TCP 서버로 전달됐다. Cloudflare에 따르면 이를 통해 상태를 저장하고 저장된 월드에서 객체를 재시작할 수 있는 멀티플레이어 Minecraft 서버를 실행할 수 있었다.
이 발전이 중요한 이유
이 변경의 실질적인 가치는 새로운 컴파일 타깃을 추가하는 데만 있는 것이 아니라, Workers에서 실행하기 위해 다시 작성해야 하는 라이브러리와 애플리케이션의 수를 줄이는 데 있다. 그러나 Cloudflare는 이 지원을 실험적이며 사전 출시 단계라고 설명하고 있으며, 새로운 Tokio 설계와 JSPI 지원, 일부 Emscripten 통합은 여전히 개발 중이고 upstream 검토를 받고 있다. 따라서 이 경로는 네이티브 Rust 애플리케이션 실행을 실험할 수 있는 가능성을 열어 주지만, 아직 모든 기존 실행 환경을 대체할 완전하고 안정적인 대안임을 입증한 것은 아니다.