Kobako:WebAssembly 的記憶體交換
前幾篇說明了選擇 MessagePack 的過程,然而使用 WebAssembly 還要能夠互動,跟原生的套件互動方式有一點不太一樣。
理由是我們要打造的是沙盒(Sandbox)來隔離不安全的程式碼,這表示操作基本上是接近單向的,在沙盒中執行的程式,是不能碰到任何宿主(Host)的記憶體,那麼原本預想的方法呼叫,就需要一些特別的方式來處理。
前幾篇說明了選擇 MessagePack 的過程,然而使用 WebAssembly 還要能夠互動,跟原生的套件互動方式有一點不太一樣。
理由是我們要打造的是沙盒(Sandbox)來隔離不安全的程式碼,這表示操作基本上是接近單向的,在沙盒中執行的程式,是不能碰到任何宿主(Host)的記憶體,那麼原本預想的方法呼叫,就需要一些特別的方式來處理。
上週末我在 COSCUP 的演講「讓 AI 接管你的應用,打造微秒級無縫的 Ruby 安全沙盒」分享 Kobako 設計過程中的一些考量,後續的提問被問到在 AI 時代不太需要考慮語言時,為什麼要選 Ruby 呢?
簡單地回答,單純就是「我喜歡用 Ruby 這個語言」然而在 Kobako 的設計,還有很多更深層的考量。
雖然是受到 ruby.wasm 的限制才選擇 mruby 來作為沙盒(Sandbox)的語言,但也不代表跟 CRuby 都使用相同的語言標準(ISO/IEC 30170:2012)就讓這個目標輕鬆實現,相比 CRuby 在 mruby 上有很多限制存在。
這是 mruby 為了能夠在嵌入式系統這類環境運作必要的取捨,相對的輕量的特性剛好也是一種 Embedded Sandbox 的優勢,我們把 Ruby 語言沙盒嵌入到任何語言的這種想法,變成可行的選項。
Kobako 是近期我針對 Ruby 生態系中,對 Harness Engineering 支援所開發基於 WebAssembly 和 mruby 的沙盒(Sandbox)用來填補 AI 所撰寫的程式碼,沒有可以安全運行的環境。
關於 Kobako 的設計理念,我在 上一篇文章 已經介紹過,這次想聊的是效能。在初期的版本中 Cold Start(冷啟動,通常指初次啟動)大概要花上 500 ms 左右,這遠比最佳實踐通常會抓 200 ms 回應來說慢的不少,即使 AI 通常接受更慢的回應,但這不是等待 LLM 回應,仍該用過去的 API 標準來看待。
前陣子看到 Throughbot 這間在 Ruby 圈 算是蠻有名的公司做了一個叫做 Suspenders 的 Gem 主要是對 Rails 擴充,簡單說就是基於原本的 rails new 做了一個替代品,而這個替代品會自動幫你先做好一些原本要手動做的事情。
像是安裝好常用的 Gem、套版之類的,想了一下覺得五倍其實也很需要,不少新專案也都是從我這邊經手初始化的,有一個這樣的工具會省下不少時間。
所以 Bankai (卍解) 這個 Gem 就樣做出來了,裡面基本上就是設置好在五倍大多數時候用的標配 Ex. GitLab CI 設定、RSpec 等等
但是又發現好像不太夠用,有些時候有 Docker 會方便很多,但是 Bankai 現在做不到!
手邊有一個專案剛好是需要滿足「多網站」並且每個網站都能夠「多語言切換」這兩個條件,在這兩個解決方案中最好處理的就是 Apartment 和 Globalize 這兩個 Ruby Gem 了。
不過,在某些情況卻變成了問題。幸好運氣不錯的是還在開發階段,還有辦法將這個問題透過替換 Gem 進行修正。