Wasmer
- 와! new container technology
- 요약: 웹어셈블리 런타임 이거 좋아보이는데 브라우저에서 떼와서 여기저기 쓰자
장점
이 친구들이 주장하는 장점을 찾아보았는데, 대충 아래 내용
- cross-language + cross-platform 런타임
- 근데 이제 빠르고 가벼운
단점
- 이론상 아무 언어의 코드를 아무 데서나 짤 수 있는 만능짱짱런타임같지만, 아무래도 런타임에 WASM 레이어가 한 겹 추가되는 것일테니 성능이 그렇게까지 좋진 않을거란 생각이 든다. 🤔
- 또 뭐가 있는지 모르겠어서 GPT를 좀 고문했더니, WASM 런타임 아래는 사실상 샌드박스라 (장점도 있지만) 디버깅이 쉽지 않다고 함
출발
러스트는 처음 건드려봐서 뭐가 뭔지 모르지만 러스트로 간단한 sum 함수를 짜보았다
cargo build --target wasm32-unknown-unknown --releaseShow⯆
src
package main
import (
"fmt"
"os"
"github.com/wasmerio/wasmer-go/wasmer"
)
const lustWasmFileName = "./rust.wasm"
var (
sumFuncRust func(...interface{}) (interface{}, error)
initializedRust bool
)
func init() {
engine := wasmer.NewEngine()
store := wasmer.NewStore(engine)
wasmBytes, err := os.ReadFile(lustWasmFileName)
if err != nil {
panic(err)
}
module, err := wasmer.NewModule(store, wasmBytes)
if err != nil {
panic(err)
}
importObject := wasmer.NewImportObject()
instance, err := wasmer.NewInstance(module, importObject)
if err != nil {
panic(err)
}
sum, err := instance.Exports.GetFunction("add")
if err != nil {
panic(err)
}
sumFuncRust = func(args ...interface{}) (interface{}, error) {
if !initializedRust {
return nil, fmt.Errorf("not initialized")
}
return sum(args...)
}
initializedRust = true
}
func getSumRust(a, b int32) int32 {
iface, err := sumFuncRust(a, b)
if err != nil {
panic(err)
}
return iface.(int32)
}Show⯆
이렇게 나온 wasm 바이너리를 적당히 옮겨와서 실행해주었습니다. 3이 잘 나온다.
fmt.Println(getSumRust(1, 2))Show⯆
벤치마킹
- 을 할 수가 없다….
- 호출 횟수가 많아지면 스택오버플로우가 나는 것인지, sigsegv가 떠버린다..
- 뭔가 싶어 깃헙 가봤더니
- 그만 알아보자..