小試牛刀:基於Golang的騰訊雲Serverless使用體驗

  • 2019 年 12 月 28 日
  • 筆記

| 導語:Serverless符合雲計算髮展的方向,把用戶關注點放在業務功能上,屏蔽底層網路框架、計算資源和機器運維等細節。這裡基於Golang試了一把騰訊雲SCF,簡單把使用體驗記一下

目錄

一、談談Serverless背景

  1. 為什麼要使用Serverless?
  2. 幫業務解決什麼問題?
  3. 核心構成:Trigger+FaaS+BaaS

二、基於Golang的騰訊雲SCF簡易使用流程

  1. 創建編輯函數
  2. 編寫Golang程式碼
  3. 上傳調試
  4. 添加函數觸發器
  5. 完善ApiGateway配置
  6. 查看函數日誌
  7. 查看函數監控

三、談談Serverless使用感受

  1. 優缺點和使用場景
  2. 當前SCF業務接入情況
  3. 冷啟動問題
  4. 關於本地快取/全局變數的使用
  5. 調試工具不方便
  6. 測試環境搭建
  7. 關於灰度策略

一、談談Serverless背景

為什麼要使用Serverless?

  • 業務應用開發:聚焦業務邏輯、變輕變薄變簡單
  • 背後基礎設施:能力不斷完善、變重變厚變標準
Serverless演進.png

幫業務解決什麼問題?

讓業務在無伺服器架構演變中收益:

無伺服器架構.png

核心構成:Trigger+FaaS+BaaS

Serverless由Trigger+FaaS+BaaS構成:

  • Trigger:函數的觸發器,一般有ApiGateway、定時器、消息隊列等多種觸發模式
  • FaaS:函數即服務,Serverless的核心,完成業務應用邏輯的載體
  • BaaS:後端即服務,FaaS運營依賴的遠端組件或服務,比如DB、KV、COS和後端SVR等

如一個背單詞小程式簡要架構圖:

背單詞簡要架構圖.png

二、基於Golang的騰訊雲SCF簡易使用流程

騰訊雲SCF:https://cloud.tencent.com/product/scf

創建編輯函數

  • 登錄到騰訊雲控制台後,選擇函數服務>選擇地區和namespace->創建函數
  • 幾個主要關注項:運行角色、超時時間、環境變數、公網/內網訪問、日誌集等
創建函數.png

編寫Golang程式碼

  • 引入SCF的Golang SDK:github.com/tencentyun/scf-go-lib/cloudfunction
  • 下面是最簡單的SCF程式碼,通過cloudfunction.Start()綁定Handler,函數觸發後會調用
  • 入參ctx為環境變數,req為自定義請求體(這裡用ApiGateway觸發,所以用了SCF默認的ApiGateway請求體結構),出參string為函數輸出數據
編寫程式碼.png

上傳調試

  • 編譯出二進位後,上傳到SCF上就完成部署了。golang只支援上傳二進位,像python、nodejs等腳本語言可直接上傳程式碼且在控制台上編輯
  • 除了控制台,一般使用VsCode插件或者命令行工具 CLI來上傳
  • 上傳完保存後,就可點測試觸發函數,入參為可選測試模板或自定義參數
上傳函數.png

添加函數觸發器

  • 選擇觸發方式,就可以添加1個或多個函數的觸發器,當前CSF支援了API網關、Ckafka、CMQ、定時器等常用方式
  • 添加了ApiGateway後,就自動給你生成url,一條cgi就完成了,不需搭建nginx、cgi-proxy等工程,全部雲給你快速搞定
添加觸發器.png

完善ApiGateway配置

  • 點擊API服務名,就可到ApiGateway的控制台,管理Api的訪問方式、掛業務域名、配錯誤碼、管理版本和環境等等
完善ApiGateway.png

查看函數日誌

  • 選擇運行日誌,就可看到函數每次觸發的運行日誌資訊。但只能按時間和請求ID檢索,很不方便。一般通過掛載日誌集,同步到騰訊雲日誌服務
函數日誌.png

查看函數監控

  • 同樣,監控資訊里也包含了函數運行時間、流量、吞吐量等一些基礎監控,也可配告警。更個性化和深入的業務監控,就需業務接入雲監控等其他組件了
函數監控.png

三、談談Serverless使用感受

優缺點和使用場景

  • 優點:真心叫快速上線;降低開發運維成本,特別是對機器這方面;統一業務雲開發框架;兼容微服務架構能力;能做到自動擴縮容,按需付費;
  • 缺點:對雲平台強依賴,被綁架以後必須都和雲玩;服務類型受限,像無狀態、長期運行等服務不合適;當前調試發布功能真心不完善;冷啟動問題需優化
  • 使用場景:雖然有些服務受限,以及存在調試不方便和冷啟動等問題,但我感覺Serverless作為一種全託管、免運維的模式,能做的場景非常多。不只是後台業務服務、像數據服務、AI服務等都可以Serverless化

當前SCF業務接入情況

  • 騰訊內:手機管家,NGW,微信內讀書/支付一堆小程式,騰訊影片,騰訊地圖,騰訊相冊等
  • 騰訊外:拼多多的運營活動小程式,TPLINK,英孚教育,北京尚德,新東方等
  • 吞吐比較大的函數超過10+億/天調用

冷啟動問題

很多人擔心函數冷啟動,需初始化環境與VM、拉取程式碼等執行過久,導致首批請求失敗。這裡也有一些優化方案:

  • 函數打薄:通過減少函數程式碼等,讓容器更輕啟動更快速
  • 實例預留:Serverless比較聚焦討論的話題,通過歷史函數訪問模型,計算實例預啟動和保留策略,也可以業務自己配置,這裡就不展開

關於本地快取/全局變數的使用

目前SCF函數執行完會有3min左右環境保留,所以像本地快取還是可使用的,只是什麼時候失效變成未知數

此外,SCF也提供了像ServerlessDB等SDK,對連接池做了一些優化

調試工具不方便

作為剛入門的,也可能因為不熟悉,真心覺得Serverless調試還不是很方便,本地測試環境和現有測試服務打通很繁瑣

幾個點後面可完善使用:

  • VsCode插件:查看函數,開發調試,同步文件等
  • 命令行工具CLI: 實現函數打包部署,可和腳手架/CI結合使用
  • 用例調試:本地和雲端調試,完善用例工具

測試環境搭建

因為SCF函數並沒環境區分,環境變數也只能設置一種,所以一般通過不同命名空間下,創建不同的函數來做測試環境。函數可一鍵複製,減少創建成本,但始終覺得有些冗餘

關於灰度策略

現在SCF發布有版本控制,但還不支援流量控制和灰度策略。這點對於每次慢慢灰度小心翼翼的我很不習慣,希望可以早日完善這個功能