海帶(hydai) 是一個 WebAssembly Runtime, WasmEdge 的 maintainer。WebAssembly 這個技術看似與雲原生(Cloud Native)沒有關係,實際上本來也沒有關係。究竟是命運的捉弄?亦或是冥冥之中無形地安排?在陰錯陽差之下,海帶便開始了這條 Cloud Native X WebAssembly 的不歸路。
那是在內湖辦公室,一個月黑風高的夜晚,我依稀記得與夥伴們坐在會議室中探索著 WebAssembly 這項技術未來的可能性,以及討論著能幫助這個專案能夠繼續成長哪些相關的功能。
這時忽然電燈閃了一下,我眼前一暗,再睜眼時已經是回到遠在嘉義的媽祖廟中,祂用慈祥和藹的目光注視著我,語氣更是親切和緩地說著:「孩子,你困惑了、迷惘了,但我在這。世人都說我愛叫人去選總統,但我知道你現在不想從政,只想寫程式。WebAssembly 該往外走,該與那些生活中的工具相結合。還記得你最常用的工具嗎?」
「您說的是...?」,手邊突然冒出平常在用的 macbook,打開終端機看見我最後的指令是 docker run --rm -it fedora:latest
祂笑著說:「孩子,你悟了嗎?」
我困惑地仰望著祂:「我不懂,我真不會」
祂頓了頓:「那是 Container、那是 Docker、那是 OCI runtime。你做的不就是 WebAssembly runtime 嗎?」
腦海中彷彿被驚雷打到:「crun 也好、runc 也罷,都是 OCI runtime。WasmEdge 是 WebAssembly runtime。兩個都是 runtime 那為什麼不能是同一個 runtime 呢?!是呀,一個 runtime 各自表述!!!」
祂笑了,依舊是那麼慈祥:「你悟了」
「海帶?海帶?!!!開會你發什麼呆?」夥伴們在我面前揮著手,把眼神略微恍惚的我拉回熟悉的會議室裡。
「我悟了!!! I have WebAssembly, I have Container, Ugh, WebAssembly+Container!!!」我激動地大喊著,迎來的是夥伴們好似在看白癡的眼光。
「咳咳咳,讓我重新組織一下語言,不要覺得我瘋了RRRRRR」
WebAssembly(縮寫成 Wasm) 的設計理念是什麼?
Wasm 最初被設計來做為一種具備可攜帶性(Portable)的二進位格式(Binary-format),目標在網頁瀏覽器中能夠透過這個格式來執行高效能且更加複雜的應用程式,且能夠支援更多不同的程式語言。
在這個前提下,Wasm 天生就有以下的特性:
「海帶你等等,你說的我都懂,但這跟 Container 有什麼關係?」夥伴們依舊保持著質疑的眼神。
「媽祖跟我開示過,祂說有關係就有關係,你看那個誰不是被托夢以後就很堅持要選總統了嗎?難道你不信媽祖?」
「我信,但媽祖只開示過你,海帶,你給翻譯翻譯,什麼叫做有關係?」
Wasm 執行的單位是一個應用程式。這個程式可以是一個網頁伺服器、也可以是一隻努力挖呀挖呀挖的爬蟲、更可以是黃牛們最愛的搶票服務,但不論是什麼他就是一個程式。
而相對應的 Container 裡面可以是有多個應用程式所組成的服務,先有個基礎的系統:Ubuntu 也好、Alpine 也罷、Debian 也不錯、Fedora 也能用,這些都是在執行應用程式前需要先選擇的,接下來才是把對應的相依性套件、服務、應用程式給安裝好,並且啟動。
但如果只是要部署一個輕量的應用程式,我們真的需要從系統那個層級開始,一步步把對應的磚頭給搭起來嗎?這些過程隨著步驟地增加,對應的成本也自然而然地提升了。Wasm 可以為其分擔解憂,提供一種更輕便的手段來執行需要被 Container 所包裝的服務。這就是連結性。
「媽祖怎麼什麼都懂?太妙了!」夥伴也悟了,會議室的氣氛瞬間快活了起來。
這時候的海帶與他的快樂夥伴們還不知道,接下來能夠與 crun 還有 docker 進行深度整合,並且 WasmEdge 將成為了 CNCF Sandbox Project。
本系列將覆蓋以下的內容: