主頁 > 軟體設計 > 聊一聊Serverless

聊一聊Serverless

2021-02-18 10:22:44 軟體設計

聊一聊Serverless

    • Serverless是什么
    • 云計算發展程序
    • Serverless的優勢
    • Serverless的不足
    • 云函式
      • 冷啟動
      • 熱啟動
      • 函式實體
      • 不同語言冷啟動時長排名
      • 首次呼叫超時
      • 性能優化
    • SFF
    • BaaS
    • 再會
    • 推薦閱讀

Serverless是什么

從單詞角度理解,server譯為服務,less譯為少,Serverless可以理解為無服務或輕服務,

從語意角度理解,之所以叫輕服務,是因為和傳統的PaaS(平臺即服務)相比,用戶不需要關心服務器的部署與配置,但這并不意味著不需要服務器,只是這些東西皆由云平臺來提供,

從架構角度理解,Serverless=FaaS+事件驅動+BaaS=無服務器計算(Serverless computing)

  • Faas:Function as a Service,函式即服務
  • 事件驅動:通過事件觸發的形式去完成函式的呼叫,處理請求和回應(如定時任務/http請求…)
  • Baas:Backend as a Service 后端即服務

云計算發展程序

下圖為云計算發展的整個程序,同時也是Serverless的發展程序,共分為四個階段,

在這里插入圖片描述

物理機階段:此時如果進行一個網站的開發是極為麻煩的,不僅需要購置物理機,還要手動安裝各種運行環境,開發,部署,測驗,上線,除此之外,還要在物理層面上解決電,網,硬體磨損等各種問題,

IaaS階段:IaaS指的是基礎設施即服務,隨著虛擬化技術的不斷發展,出現了很多基于虛擬化的云廠商和產品,如阿里云ESC,這個階段,無需自建機房,采購以及配置硬體設施,云平臺會提供這些基礎設施,也正因如此,那些物理層面的電,硬體磨損什么的,用戶無需關注,

PaaS階段:PaaS指的是平臺即服務,所謂的平臺,其實是結合業務發展,在IaaS基礎上,將一些如資料庫,中間件等通用功能做成服務,虛擬化技術可以讓用戶不必關心硬體問題,后來出現的容器技術可以讓用戶不必關心運行環境差異的問題,容器技術出現后,意味著服務器上部署的不再是應用,而是容器,當容器多了后,可通過k8s進行管理,

Serverless階段:這個階段是真正解放生產,專注業務的階段,在FaaS層面,應用由諸多個獨立的函陣列成,每個函式實作各自的業務邏輯,在資料獲取層面,BaaS 將后端能力封裝成了服務,并以介面的形式提供給FaaS,事實上,資料庫的增刪改查剛好對應Restful API的POST/DELETE/PUT/GET,

Serverless的優勢

專注業務,快速迭代

首先,云平臺從開發人員手中接過服務部署,配置等運維作業,開發人員壓力減小,只需關注業務開發本身即可,其次,傳統開發模式下,一個完整的開發流程需要經過前后端并行開發,后端部署,聯調測驗,上線等程序,比較繁雜,而Serverless可以讓前端人員跨過server直接和資料庫互動(FaaS+BaaS),極大地簡化了開發流程,

節省維護和運營成本

服務提供方無需在業務上線前預估資源,也無需單獨購置服務器,Serverless會根據實際請求數量進行自動擴縮容,實行按需計費,在空閑情況下,憑借短時間內完成冷啟動的優勢,Serverless可以縮容的極致為0,即無任何計算消耗,這也是PaaS做不到的,從這點上考慮,那些每天大部分時間都沒有流量或者有很少流量的應用是極為適合Serverless落地的,

在這里插入圖片描述

Serverless的不足

狀態管理能力弱(針對FaaS)

為了保證可以自動擴縮容,FaaS應用就必須是無狀態的,有狀態的服務就要考慮資料的存盤,需要BaaS的支持,

除錯困難

本地環境和云環境始終是有區別的,有些報錯資訊只能在云環境查看,而且某些問題不太容易定位是本地環境還是云環境的產生的,

云函式

定義

云函式可以看作是Serverless的產品之一,每一個函式都可以看作是一個服務,

與此同時,云函式也具備FaaS能力,是FaaS模式的具體實作,

觸發器

觸發器用于觸發某一類事件,不同云平臺支持的觸發器型別也可能不同,但基本上每個云平臺都會包含HTTP觸發器和定時觸發器兩大型別,

HTTP觸發器對于客戶端而言,就是一個可訪問的資料介面,

定時任務型別的觸發器,會在指定時間周期內執行某一任務,

為限制頻繁呼叫,幾乎所有云平臺都會對定時的時間粒度進行限制,如最小一分鐘,

體驗

  • doc
  • scf

在這里插入圖片描述

冷啟動

定義

在Serverless computing世界中,函式是按需運行的,如果沒有請求,就不會有函式實體占用函式服務資源,這種僅在必要時運行函式的整個執行程序,被稱為冷啟動,

下圖為冷啟動包含的階段以及云廠商和開發者各自所負責的部分,

在這里插入圖片描述

  • 下載代碼: FaaS 平臺本身不會存盤代碼,這也是為了能夠縮容到0,上傳或自己撰寫的代碼實際上會被放在存盤服務中,在冷啟動程序中會從存盤服務中獲取函式代碼后下載,
  • 啟動容器: 代碼下載完成后,FaaS 會根據函式的配置,啟動對應容器,也正是通過容器技術,FaaS 可保證每個函式的獨立性,
  • 初始化運行環境: 分析代碼依賴、執行用戶初始化邏輯、初始化入口函式之外的代碼等,
  • 運行代碼: 呼叫入口函式執行代碼,這個階段比較特別,可能是冷啟動,也可能是熱啟動,

熱啟動

FaaS有兩種模式,一種是用完即毀,對應從0到1的冷啟動,

另一種是常駐記憶體,對應函式實體可復用的熱啟動(串行),

常駐不是永久,如果一段時間內沒有事件觸發,函式實體還是會被銷毀的,

熱啟動雖然在一定程度上可以提高請求處理效率和應用性能,但某些情況下也要特別注意,熱啟動可能不是我們想要的,

在某些涉及時間的場景,我們需要將時間的生成放在入口函式中用以保證每次函式執行后時間重新計算,如果這部分代碼放在入口函式之外,那么在最初冷啟動后,熱啟動使用的一直就是舊的時間,且不會更新,

請求回應鏈路

解釋完冷啟動后,再來看一下完整的請求回應鏈路,

在這里插入圖片描述

  1. 用戶發起請求,觸發器接收
  2. 事件驅動,觸發器通知函式服務處理http請求
  3. 函式服務進行函式實體檢查,有則呼叫,沒有則從函式代碼倉庫拉取后創建再呼叫
  4. 函式將處理完的結果交給觸發器
  5. 觸發器將其回應到客戶端用戶
  6. 一段時間內若無事件觸發,FaaS應用縮容至0

函式實體

每一個函式實體背后都是一個容器,FaaS 通過容器來隔離每個函式實體,保證函式的獨立性,

如下圖所示,容器內最主要的是運行環境,包含編程語言,內置模塊,FaaS 內置依賴和函式代碼,

在這里插入圖片描述

  • 編程語言:創建FaaS應用所指定的語言,如Node
  • 內置模塊:所選編程語言的內置模塊,如fs之于Node
  • FaaS 內置依賴:FaaS平臺為便于開發者開發提供的某些默認依賴
  • 函式代碼:自己撰寫的代碼

不同語言冷啟動時長排名

不同語言的冷啟動時長是有差異的,下圖為不同語言的冷啟動時長排名,

橫坐標為分配的記憶體空間,縱坐標為平均冷啟動時長,單位ms

在這里插入圖片描述

從上圖我們可以看到兩個關鍵資訊:

  • 分配的記憶體空間越大,冷啟動時長越短
  • Nodejs冷啟動時間是最短的

首次呼叫超時

  • 冷啟動快慢時長差距還是很明顯的,從毫秒級到秒級甚至分鐘級皆有可能,
  • 對于Node這種能夠短時間內完成冷啟動的語言來說,一定程度上就是FaaS應用敢縮容到0的底氣,
  • 但是像java這種冷啟動時間比較久的語言,就有可能出現首次呼叫超時的問題,

性能優化

Serverless性能瓶頸主要在冷啟動耗時上,所以性能優化也是從這方面入手,

預熱: 其本質是將冷啟動提前**,**使用熱啟動的方式對要執行的函式進行提前觸發,用以完成耗時的冷啟動程序,這樣在某個流量峰值,運行的代碼就都是熱啟動的形式,處理效率和應用性能提高,

減小代碼體積: 函式應用實體收縮到0后,當有新的請求到來,需要下載代碼,如果代碼體積太大,這個程序就會十分耗時,通過壓縮,按需引入等方式對代碼進行精簡,可減少冷啟動耗時,

提高并發配額: 默認情況下一個函式實體只能處理一個請求,但可通過提高并發配額進而提高函式的處理能力,如額度為3,則一個函式實體現在可處理三個請求,相比之前少了兩次冷啟動的程序, 并發限制數量取決于分配的記憶體大小,對于騰訊云來說,128記憶體下,最大并發為900,

在這里插入圖片描述

選擇冷啟動耗時少的語言 : 如node,python

SFF

BFF(Backend For Frontend)和SFF(Serverless For Frontend)解決的是同一個問題,作為前后端資料通信的中間層,把后端回傳的不符合前端預期的元資料轉成前端預期的資料格式,

出現這種非預期格式的元資料,大多是微服務導致的(一個后端介面資料來自多個后端應用),

相比BFF,SFF用完即毀的特點體現的更明顯:請求-轉換-回應-空閑-縮容為0,

從這點考慮Serverless也適合用于中間層資料處理,

在這里插入圖片描述

BaaS

FaaS適用于那些無狀態場景,而涉及資料存盤等有狀態的場景,就需要BaaS的支持,

舉個例子,計算PV(page view).

let pv = 0;

function handler(event) {

  pv++;

  return pv;

}

對于FaaS來說,這種統計其實并不精準,如果一段時間沒有新的事件觸發,函式執行完后,它的運行環境就會被銷毀,函式實體收縮為0,當下一次請求過來時,函式應用會創建一個新的實體,該實體會初始化一個新的運行環境,之前的狀態不會被保留,

這種情況下,就需要BaaS的配合了,BaaS服務于FaaS ,可以讓FaaS通過介面呼叫形式來使用 BaaS,完成存盤資料,比如阿里云的表格存盤(相當于一個NoSQL資料庫),

const tablestore = require('tablestore');

async function handler(event) {

  let pv = await tablestore.get();

  pv += 1;

  await tablestore.save(pv);

  return pv;

}

這樣入庫后,即使FaaS應用收縮為0,統計資料也不會受到影響,

再會

情如風雪無常,

卻是一動既殤,

感謝你這么好看還來閱讀我的文章,

我是冷月心,下期再見,

推薦閱讀

  • 結合阿里云 FC 談談我對 FaaS 的理解
  • AWS Lambda 最新編程語言冷啟動時間測驗:Node.js 性能最高
  • Serverless入門課
  • 玩轉 Serverless 架構

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/260553.html

標籤:其他

上一篇:/etc/apt/source.list

下一篇:Scrapy簡介

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more