如何本身搭建本身的faas?

緣起

最近serverless和faas的文章不少,各大雲廠商都在推廣,看着人手癢癢,無奈業務開發沒有使用雲服務,而是使用了內部k8s集羣。因此決定本身搭建faas。說來容易,說幹就幹!javascript

其實內部早就開始了,一直想寫篇文章,無奈業務太忙,總算抽了點時間分享下。java

一句話需求

怎樣實現將任意一個函數成爲一個接口node

分析

不管是函數仍是接口本質上是想通的,都有輸入輸出。 接口的請求做爲函數的輸入,函數的輸出做爲接口的返回值,完美!chrome

函數運行

函數怎麼運行呢?瀏覽器

還好nodejs自己實現了本身的VM,很開心的把代碼丟給vm來運行,great!安全

打住!你覺得這就解決問題了嗎?bash

node官方明確指出,請不要使用VM運行不信任的代碼,你的同事的代碼可信嗎?來自大佬的發問。less

網上找了一圈發現這行代碼,你的服務就掛掉了,這怎麼能夠?函數

new vm.Script('this.constructor.constructor("return process")().exit()')
複製代碼

相信社區的力量是偉大的,又發現了VM2,如獲至寶,正如他的官方slogan那樣ui

vm2 is a sandbox that can run untrusted code with whitelisted Node's built-in modules. Securely!

大佬跑過來問,你相信他是安全就必定安全嗎?跑到issue裏面一看,而後一試,此次還好服務沒掛,可是彷佛無響應

const {VM} = require('vm2');
new VM({timeout:1}).run(`
	function main(){
	while(1){}
}
複製代碼

畢竟已經立了flag了,難道要食鹽了嗎?忍痛也要把它解掉。

沙盒安全

歸根結底,沙盒不安全,即便是VM2,也不能確信他必定安全,怎麼破?

ie瀏覽器常常崩潰,到了chrome就好不少了,爲何呢?對,沒錯,就是多進程模型。

舉個例子: 進程就像一套房子,線程是房間,房間着火房子沒了, 多進程是多套房子,毀了一套還有地方住。

咱們最終的方案就是將用戶不安全的代碼隔離在子進程中。

VMBox是獨立實現的管理函數運行的進程池,支持函數互相調用,而且完美的解決了死循環的問題。

若是對VMBox關心的同窗能夠持續關注進展哦,後面會考慮將核心開源!

實踐

目前內部實現的功能

相關文章
相關標籤/搜索