웹 어셈블리와 컨테이너
웹 어셈블리 (WebAssembly)
웹 브라우저에서 실행하는 프로그래밍 언어로 Java, C# 등과 비슷한 바이트코드 언어
다양한 프로그래밍 언어와 다양한 실행 환경 사이의 중간 계층으로, 30개 이상의 다른 언어로 작성된 코드를 가져와서 .wasm파일로 컴파일 한 다음 브라우저나 서버에서 실행할 수 있다
웹 어셈블리의 강점
- 이식성
wasm바이트 코드의 바이너리 형식은 표준화 되어있어, .wasm파일을 실행할 수 있는 런타임이면 어디서든 실행이 가능하다
- 범용성
C, C++, Rust, Go, Python, Ruby 등 다양한 언어를 .wasm 으로 컴파일 가능 (https://github.com/appcypher/awesome-wasm-langs)
- 네이티브에 가까운 성능
컴퓨팅 집약적인 작업의 경우 웹 어셈블리가 자바스크립트 보다 빠름
네이티브 코드보다는 50% 정도 느림
- 빠른 시작 시간
콜드 스타트 시간이 도커 컨테이너 보다 10~100배 정도 빠르다
- 보안
웹을 염두에 두고 설계되어 보안이 가장 높은 우선순위로 개발됨
wasm 언타임에서 실행되는 코드는 샌드박스 안에서 메모리가 할당되고 기능이 제한됨
그러나 샌드박스 안에서도 시스템 수준 인터페이스 및 하드웨어 기능을 포함한 기본 시스템 액세스도 가능
웹 어셈블리가 유용한 곳
- 자바스크립트 속도 향상
웹에서 클라이언트 사이드 코드의 속도를 높일 수 있다
- 프로그래밍 언어 상호 운용성
프로그래밍 언어 간 경계를 쉽게 넘나들 수 있어 다른 언어로 작성된 라이브러리와 프레임워크를 쉽게 혼합 가능
- 플러그인 시스템
- 임베디드 샌드박싱
- 컨테이너화
- FaaS / 서버리스 플랫폼
- 블록체인
웹 어셈블리 VS 컨테이너
웹 어셈블리는 컨테이너 보다 가볍게 프로세스 격리가 가능하기 때문에 저사양 임베디드 샌드박싱이나 엣지 컴퓨팅, 성능이 중요한 워크로드에서 강점을 보인다
또한 콜드 스타트가 빠르기 때문에 컴포넌트 기반 아키텍처에서도 웹 어셈블리가 더 유리하다
이 외에도 서버측 앱을 위한 플러그인, 웹 앱 및 서비스에서도 성능적으로 웹 어셈블리가 우수하다
하지만 장기 실행 컴퓨팅이나 데이버베이스와 같은 어플라이언스는 컨테이너가 더 유리하다
또한 대규모 서버 프로세스의 경우 웹 어셈블리로 실행하기에는 기능적인 빈약성이 있어 컨테이너가 유리하다
이외에도 리눅스 기반 클라우드 네이티브 시스템 또한 리눅스의 핵심 기능을 사용하는 컨테이너가 더 유리하다
결론은 웹 어셈블리는 짧게 실행되는, 컴포넌트 및 플러그인에 쓰는 것이 좋고 실행 시간이 긴 모듈은 컨테이너를 사용하는 것이 좋다고 본다
Reference