Zola에 WASM 플러그인 추가, Rust와 wasmi로 구현!

by DD
2개월 전
조회수 14

WASM 플러그인(WASM Plugins)을 Zola에 통합하여 웹사이트 기능 확장을 시도, Rust와 wasmi를 활용하여 구현

데이터 전달(Data Passing), ABI 설계(ABI Design), Tera 통합(Tera Integration) 등 핵심적인 기술적 난제들을 해결하는 과정을 상세히 설명

Extism과 같은 기존 프레임워크의 복잡성을 지적하며, Typst의 간결한 플러그인 프로토콜을 참고하여 자체적인 솔루션 제시

개발자 커뮤니티(Developer Community)는 접근성 높은 설명과 실용적인 예제에 긍정적인 반응을 보임

WASM 플러그인 아키텍처 설계

저자는 WASM 플러그인(WASM Plugins)을 구현하기 위해 데이터 격리 아키텍처(Data Isolation Architecture)를 고려, Host와 Plugin 간의 데이터 교환 방식을 설계했다. 특히, 기존 플러그인 프레임워크의 복잡성을 지적하며, Typst의 간단한 접근 방식을 차용하여 자체적인 ABI(Application Binary Interface)를 정의했다. 이 과정에서 alloc 함수를 활용하여 Plugin 메모리 할당을 관리하고, 문자열 및 이미지 데이터를 전달하는 방법을 제시했다. 또한, wasmi 런타임을 사용하여 WASM 모듈을 실행하고, Tera 템플릿 엔진과 통합하는 과정을 설명했다. 🚀

ABI(Application Binary Interface) 설계 및 구현

저자는 WASM 플러그인(WASM Plugins)에서 Host와 Plugin 간의 데이터 교환을 위한 ABI(Application Binary Interface) 설계를 상세히 다룬다. 특히, 데이터 미저장 정책(Zero-Retention Policy)을 준수하며, 문자열과 이미지 데이터를 안전하게 전달하기 위해 alloc 함수를 활용한 메모리 관리 방식을 제시했다. 또한, Rustybuzz 프로젝트의 경험을 바탕으로, 메모리 할당 및 해제에 대한 주의사항을 언급하며, 안전한 데이터 전달을 위한 핵심적인 고려 사항을 강조했다. 💡

Tera 템플릿 엔진과의 통합

저자는 Zola의 템플릿 엔진인 Tera와 WASM 플러그인(WASM Plugins)을 통합하는 과정을 설명한다. Tera Function 트레이트를 구현하여 WASM 모듈의 함수를 호출하고, 템플릿 내에서 플러그인 기능을 사용할 수 있도록 했다. 특히, create_image 함수를 예시로, Tera 템플릿에서 WASM 플러그인을 호출하고, 이미지 생성을 위한 파라미터를 전달하는 방법을 제시했다. 이 과정에서, WasmFunction 구조체를 정의하여 wasmi 런타임과 Tera 간의 연결을 관리하고, 템플릿 내에서 플러그인 기능을 호출할 수 있도록 했다. 🖼️

성능 및 트레이드오프 분석

저자는 WASM 플러그인(WASM Plugins) 구현 과정에서 성능 및 트레이드오프(Trade-offs)를 분석한다. 특히, 기존 플러그인 프레임워크의 복잡성과 자체 구현의 장단점을 비교하며, Extism과 같은 프레임워크의 오버헤드를 지적했다. 또한, Rustybuzz 프로젝트의 경험을 바탕으로, 메모리 관리 및 데이터 전달 방식에 따른 성능 차이를 언급하며, 효율적인 WASM 플러그인 설계를 위한 고려 사항을 제시했다. ⚖️

Adding WASM Plugins to Your App | Using Wasmi as a runtime and Zola as an example.