基於阿里雲Serverless架構下函數計算的最新應用場景詳解

摘要: Serverless概念是近年來特別火的一個技術概念,基於這種架構能構建出很多應用場景,適合各行各業,只要對輕計算、高彈性、無狀態等場景有訴求的用戶都可以通過本文來普及一些基礎概念,看看這些場景是否對用戶有一些指導意義。

原文鏈接:

基於阿里雲Serverless架構下函數計算的最新應用場景詳解(一)

基於阿里雲Serverless架構下函數計算的最新應用場景詳解(二)

Serverless概念是近年來特別火的一個技術概念。基於這種架構能構建出很多應用場景,適用於各行各業。只要是對輕計算、高彈性、無狀態等場景有訴求,您都可以通過本文來熟悉一些基礎概念,並從相關場景中獲得啟發。

關於Serverless架構的前世今生,網上比較流行一張描述人類形態發展史的網圖。從爬行猿人到蹲著的類猿人,再到直立人類,最後到使用工具的新興人類。從四隻腳爬行到直立行走,釋放了雙手,從釋放雙手到開始使用工具。

人類的進化每一次都伴隨著生產效率的提升。同理,在整個IT計算的發展里程,也是逐步提高生產效率的里程,具體演進圖如下所示:

從大型物理機到通過虛擬化技術把物理機虛擬成單個的VM資源,從虛擬化集群到把集群搬到雲計算上只做簡單運維,再到把每一個VM按照運行空間最小化切分成更細的Docker容器,再從Doceker容器變成乾脆不用管理任何運行環境的Serverless服務,即僅僅需要編寫核心代碼即可。

代際的技術變革都是把資源切分得更細緻,讓運行效率變得更高,讓硬體軟體維護變得更加簡單。IT技術架構的演進主要有以下幾個特點:

1、硬體資源使用顆粒度變小

2、資源利用率越來越高

3、運維工作逐步減少

Serverless架構主要有以下特點:

1、實現了細粒度的計算資源分配。

2、不需要預先分配資源。

3、具備真正意義上的高度擴容和彈性。

4、按需使用,按需計費。

根據Serverless的這些通用特點,歸納出下面幾種典型使用場景,供大家參考。

事件請求場景

定製圖片

網店中的商品圖片維護,根據商品陳列位置,要求需要動態切割成不同尺寸圖片,或者打上不同水印,當店家把圖片上傳到阿里雲OSS上,會通過函數計算上定製的trigger來觸發函數計算。根據計算規則,生成不同尺寸的圖片,滿足電商陳列使用,整個過程無需再搭建額外伺服器,也無需網站美工干預。

物聯網中的低頻請求

物聯網行業中,由於物聯網設備傳輸數據量小,且往往是固定時間間隔進行數據傳輸,因此經常涉及低頻請求場景。

例如:物聯網應用程序每分鐘僅運行一次,每次運行50ms,這意味著CPU的使用率為0.1%/小時,這也意味著其實有1000個相同的應用可以共享計算資源。而Serverless架構下,用戶可以購買每分鐘100ms的資源來滿足計算需求,通過這種方式就能夠有效解決效率問題,降低使用成本。

定製事件

用戶註冊時發郵件驗證郵箱地址,同樣通過定製的事件來觸發後續的註冊流程,而無需再配置額外的應用無伺服器來處理後續的請求。

固定時間觸發

事件觸發固定時間觸發,例如在夜間或者服務空閑時間來處理繁忙時候的交易數據,或者運行批量數據,來生成數據報表,通過Serverless方式,不用再額外購買利用率並不高的處理資源。

流量突發場景

彈性擴展應對突發流量

移動互聯網應用經常會面對突發流量場景。例如:移動應用的通常流量情況是QPS 20,但每隔5分鐘會有一個持續10s的QPS 200流量(10倍於通常流量)。傳統架構下,企業必須擴展QPS 200的硬體能力來應對業務高峰,即使高峰時間僅占整個運行時間的4%。

在Serverless架構下,您可以利用彈性擴展特性,快速構建新的計算能力來滿足當前需求,當業務高峰後,資源能夠自動釋放,有效節省成本。

轉碼和流量擴容

視頻直播某次專場活動,由於無法預估會有多少點播的觀眾視頻接入,把轉碼和流量擴容這部分內容通過Function來處理,無需考慮並發和流量擴容。

處理大數據場景

由於安全審計問題,您需要從OSS(多個地域)過去一年的數據(1個小時一個文件)中找出特定關鍵字訪問的日誌,同時做聚合運算(計算出總值)。如果使用阿里雲函數計算,您將高峰期每2小時的訪問日誌,或者低谷期每4小時的訪問日誌交給一個計算函數處理,並將處理結果存到RDS中。使用一個函數分派數據給另一個函數,使其執行成千上萬個相同的實例。

這樣會同時運行近千個計算函數(24 x 365 / 10),在不到一分鐘的時間內完成整個工作。同樣的事情交給ECS+計算腳本來做計算,單單為這些instance配置網路就讓人頭疼(不同地域無法走內網下載OSS文件):instance的數量可能已經超出了子網中剩餘IP地址的數量(比如,您的VPC使用了24位掩碼)。

下面結合阿里雲的函數計算產品來講解各個應用場景中架構以及如何解決的場景中的痛點。阿里雲的函數計算是基於Serverless這種架構實現的一個全託管產品,用戶只需要上傳核心代碼到函數計算,就可以通過事件源或者SDK&API來運行代碼。函數計算會準備好運行環境,並根據請求峰值來動態擴容運行環境,函數計算是按照執行時間來計費,請求處理完成後,計費停止,對於有業務請求有明顯高峰和低谷的應用來說,相對節省成本。

下圖是函數計算的一個開發者試用操作流程:

步驟1:開發者編寫代碼,目前支持的語言Java、NodeJS、Python等語言。

步驟2:把代碼上傳到函數計算上,上傳的方式有通過API或者SDK上傳,也可以通過控制台頁面上傳上傳,還可以通過命令行工具Fcli上傳。

步驟3:通過API&SDK來觸發函數計算執行,同樣也可以通過雲產品的事件源來觸發函數計算執行。

步驟4:函數計算在執行過程中,會根據用戶請請求量動態擴容函數計算來保證請求峰值的執行,這個過程對用戶是透明無感知的。

步驟5:函數執行結束後,可以通過賬單來查看執行費用,根據函數的實際執行時間按量計費,收費粒度精確到100ms。

講解完上面的流程後,下面會詳細講解3個Serverless的應用場景,通過案例分享能讓您對Serverless這種架構有更清晰的認識。

事件觸發計算能力

場景描述:用戶通過手機終端,Web應用,或者PC工具把各種文件包括圖片、視頻以及文本等上傳到OSS(對象存儲,下同)後,利用OSS的PutObject的事件可以觸發函數計算對上傳後的文件進行處理,目前比較典型的場景當用戶把視頻文件上傳到OSS後,觸發函數計算把對象的Meta信息獲取並傳輸給核心演算法庫,核心演算法庫根據演算法把相應的視頻文件推送CDN源站,達到特定視頻熱載入的處理。另外一個場景,視頻文件上傳到OSS後也同時觸發函數計算同步做多轉碼率的處理,並把處理後的視頻文件存儲到OSS中,完成輕量的數據處理。

在多媒體的處理場景中,經常會碰到海量文件上傳到OSS後,還需要對文件進行進一步的加工,例如加水印、轉碼率、獲取文件屬性等操作,這個場景中,用戶在處理的時候會遇到以下需要解決的技術難點:

1、 如何接收文件上傳後的動作事件,通常的做法是定製消息通道來接收OSS事件通知,搭建一個運行環境,並編寫相關的代碼來處理事件通知。

2、如何高效的處理完海量上傳的文件。

3、如何無縫的把多個雲產品連接起來。

通過函數計算能比較方便解決以上幾個技術難點,首先函數計算可以設置OSS的觸發器來接收事件通知,在函數計算中編寫業務代碼來處理文件,並通過內網把文件傳輸到OSS中,整個流程簡單易用可擴展。可以把核心代碼部署到函數計算中,通過函數計算來並發處理事件通知。函數計算目前打通了多款產品的內部交互,通過控制台簡單配置就可以高效的解決產品間連接問題。

事件觸發場景常規做法:

1、設置消息通道接收事件,並編寫業務代碼。

2、購買伺服器資源做後端數據處理。

3、設計一套多並發框架完成業務上傳文件峰值的處理。

4、開通多個產品,並調用SDK代碼來完成業務交互。

函數計算解法:

1、在控制台上配置事件源通知,編寫業務代碼。

2、代碼寫到函數計算里,不需要管理軟硬體環境。

3、 業務高峰期函數計算會動態伸縮,無需管理。

4、內置打通多款產品,簡單配置就可以無縫對接。

利用彈性擴容(視頻直播多人連麥場景)

場景描述:

直播間的客戶端把主播和連麥觀眾的音視頻採集發送給函數計算做混流服務,函數計算把數據彙集後交給混流服務進行合成,並把合成畫面視頻流推送給CDN,終端觀眾實時拉取直播流,能實時看到混流合成畫面。

視頻直播應用場景中,有一種場景視頻直播的多人連麥,主播可以同時和多個工作進行連麥,把多個觀眾或者好友畫面接入,並把畫面合成到一個場景中,供給更多觀看直播的觀眾觀看。這個場景中,有幾個技術難度需要關註:

  1. 連麥的觀眾不固定,需要考慮適度的並發和彈性。
  2. 直播不可能24小時在線,有較為明顯的業務訪問高峰期和低谷期。
  3. 直播是事件或者公眾點爆的場景,更新速度較快,版本迭代較快,需要快速完成對新熱點的技術升級。

綜合以上幾個特點,可以通過Serverless這種架構的來完美解決以上痛點。

函數計算作為連麥觀眾和主播接入的實時音頻和視頻轉發集群,當並發量過來時候,函數計算自動擴容多個執行環境來處理實時數據流,當業務高峰期過去後,會適度縮減資源使用,代碼管理部署在雲端,代碼迭代可以隨時進行修改和維護,無需再多管理一套軟體運行環境。

視頻直播場景常規做法:

  1. 購買負載均衡應付並發。
  2. 購買計算資源做數據處理。
  3. 業務低谷期需要想辦法釋放硬體資源來節省成本。
  4. 多版本要維護多套運行環境。

函數計算解法:

1、把負載分發程序寫到函數里。

2、多版本迭代無需更換運行環境,僅僅替換代碼版本即可。

3、業務訪問按需付費,業務低谷期無費用。

物聯網數據處理場景

整個架構圖分成2部分內容:

  • 一部分是Web應用,模擬一個社交內容更新和數據處理的流程,Web用戶通過API網關把請求轉發到函數計算進行處理,函數計算把處理後的內容更新到資料庫中,並更新索引,另外一個函數計算把索引更新推送的搜索引擎供給外部客戶進行檢索,完成整個數據閉環處理。
  • 另一部分是智能設備通過IoT網關把設備狀態推送到函數計算處理,函數計算通過API介面把消息通過移動推送服務,推送給移動端進行狀態確認和管理。在智能設備狀態處理的場景中,同樣也會碰到幾個核心技術問題要解決,當海量設備把狀態發送到IoT平台後,如何設計一套高效非輪詢的技術框架來處理設備狀態數據;如何把處理後的數據高效透傳其他產品,例如寫資料庫或者推送給移動端。

IoT設備狀態場景常規做法:

  1. 設置消息通道接收事件,並編寫業務代碼。
  2. 購買伺服器資源做後端數據處理。
  3. 開通多個產品,並調用SDK代碼來完成業務交互。
  4. 維護相關硬體軟體環境。

函數計算解法:

  1. 定製IoT平台的事件通知,直接把業務代碼寫到函數計算中。
  2. 不需要維護運行環境,用完即可釋放。
  3. 控制台配置,就可以把信息透傳給相關產品。

通過兩種方式的對比,能看出函數計算的解法更具備通用性和大量減少維護工作。

共享派單系統詳解

客戶通過派單平台選著某種商家提供的服務,可能是餐飲、商品、或者服務。派單平台通知最近的騎手到最近的商家拿到服務並派送到客戶手裡。一個簡單的流程圖如下:

流程詳解:

步驟1、客戶通知派單平台下單某商品

步驟2、派單平台通知最新騎手

步驟3、派單平台同時通知商家商品售賣出去

步驟4、騎手到指定的商家獲取商品

步驟5、騎手配送到客戶所在地

這個派單場景中,要解決幾個棘手的技術:

整合多種資源,計算資源會涉及到,騎手位置信息、最優路徑規劃、車況情況、調度系統等

低延遲:派單系統對訂單的響應要求很高,從接單到商家在到客戶,整個閉環都需要在段時間內完成。

海量數據:涉及到三方面的數據,客戶數據、商家數據、平台騎手數據、位置信息、商品信息等。

請求明顯波峰波谷:派單系統在一天中的資源使用非常不均衡,波峰期,例如外賣,在中午和晚飯達到高峰,平時空閑。

通過技術選型轉化成阿里雲產品的解決方案後,函數計算結合其他產品比較完美的解決上述問題,解決方案圖如下圖所示:

流程詳解:

客戶APP把訂單請求通過API網關透傳給函數計算,函數計算把處理後的數據傳輸給表格存儲,表格存儲存放了騎行數據、商家信息、位置信息等,其中騎行日誌會存放到日誌服務里,便於後續做報表分析。騎行過程中騎手頭像、隨手拍街景會存放到OSS中,騎手位置可以通過函數計算去拉取第三方地圖信息,例如高德地圖等。這個方案中,函數計算可以完成動態擴容問題,API網關可以解決鑒權和安全訪問問題,函數計算打通了多款產品,可以無縫使用其他資源和內容。所有處理後的數據可以存放到表格存儲資料庫中,所有日誌都可以直接載入到日誌服務為後續數據報表服務。

共享派單系統常規做法:

  1. 購買多台伺服器來支持高峰期的訪問,訪問波谷期自行設置釋放原則。
  2. 通過編程方式完成多個產品的交互。
  3. 為了保證負載均衡,需要購買相關的產品來支撐。
  4. 人工維護相關硬體軟體環境。

函數計算解法:

  1. 定製IoT平台的事件通知,直接把業務代碼寫到函數計算中。
  2. 不需要維護運行環境,用完即可釋放。
  3. 控制台配置,就可以把信息透傳給相關產品。

兩種解法都能達到目標,從資源利用率和可維護性來看,使用Serverless架構的方式會更優。

總結

通過上面幾個個場景的詳解,我們大致可以得出這樣的結論,通過事件觸發場景、有業務訪問高峰和低谷的場景、迭代次數較多、需要快速打通多款產品場景,通過函數計算能完美的解決成本、效率、聯通等問題。

表3-1函數計算和傳統自建伺服器的優劣對比

函數計算雖然適用於很多場景,但也不是覆蓋全部應用場景的萬金油。例如某些業務在一天中沒有明顯的請求波峰波谷,請求相對平緩,那麼使用函數計算成本不見得會節省多少。Serverless這種框架是新興的技術,目前相應的支持開發工具較少,整體這個框架還在探索中。另外函數計算的執行環境是不記錄狀態的,有些耦合性較強的應用也不太適合用Serverless這種框架。受限於資源大小分配,一些大型的應用程序也不太容易能拆分能搬上來。

更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎


推薦閱讀:

關於函數的證明?
R語言之字元函數和正則表達式
怎樣求下圖中y關於x的表達式呢?
R語言常用函數匯總

TAG:架构 | 函数 | 数据处理 |