日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Serverless在编程教育中的实践

發(fā)布時(shí)間:2024/9/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Serverless在编程教育中的实践 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
簡(jiǎn)介:基于函數(shù)計(jì)算(FC)實(shí)現(xiàn)在線編程系統(tǒng)時(shí),研發(fā)同學(xué)只需要專(zhuān)注在如何執(zhí)行由前端傳入的代碼即可,整個(gè)Server端的各個(gè)環(huán)節(jié)都不需要研發(fā)同學(xué)和運(yùn)維同學(xué)去關(guān)心,基本體現(xiàn)了Serverless的精髓。

說(shuō)起Serverless這個(gè)詞,我想大家應(yīng)該都不陌生,那么Serverless這個(gè)詞到底是什么意思?Serverless到底能解決什么問(wèn)題?可能很多朋友還沒(méi)有深刻的體會(huì)和體感,這篇文章我就和大家一起聊聊Serverless。

什么是Serverless

我們先將Serverless這個(gè)詞拆開(kāi)來(lái)看。Server,大家都知道是服務(wù)器的意思,說(shuō)明Serverless解決的問(wèn)題范圍在服務(wù)端。Less,大家肯定也知道它的意思是較少的。那么Serverless連起來(lái),再稍加修飾,那就是較少的關(guān)心服務(wù)器的意思。

Serverfull時(shí)代

我們都知道,在研發(fā)側(cè)都會(huì)有研發(fā)人員和運(yùn)維人員兩個(gè)角色,要開(kāi)發(fā)一個(gè)新系統(tǒng)的時(shí)候,研發(fā)人員根據(jù)產(chǎn)品經(jīng)理的PRD開(kāi)始寫(xiě)代碼開(kāi)發(fā)功能,當(dāng)功能開(kāi)發(fā)、測(cè)試完之后,要發(fā)布到服務(wù)器。這個(gè)時(shí)候開(kāi)始由運(yùn)維人員規(guī)劃服務(wù)器規(guī)格、服務(wù)器數(shù)量、每個(gè)服務(wù)部署的節(jié)點(diǎn)數(shù)量、服務(wù)器的擴(kuò)縮容策略和機(jī)制、發(fā)布服務(wù)過(guò)程、服務(wù)優(yōu)雅上下線機(jī)制等等。這種模式是研發(fā)和運(yùn)維隔離,服務(wù)端運(yùn)維都由專(zhuān)門(mén)的運(yùn)維人員處理,而且很多時(shí)候是靠純?nèi)肆μ幚?#xff0c;也就是Serverfull時(shí)代。

DevOps時(shí)代

互聯(lián)網(wǎng)公司里最辛苦的是誰(shuí)?我相信大多數(shù)都是運(yùn)維同學(xué)。白天做各種網(wǎng)絡(luò)規(guī)劃、環(huán)境規(guī)劃、數(shù)據(jù)庫(kù)規(guī)劃等等,晚上熬夜發(fā)布新版本,做上線保障,而且很多事情是重復(fù)性的工作。然后慢慢就有了賦能研發(fā)這樣的聲音,運(yùn)維同學(xué)幫助研發(fā)同學(xué)做一套運(yùn)維控制臺(tái),可以讓研發(fā)同學(xué)在運(yùn)維控制臺(tái)上自行發(fā)布服務(wù)、查看日志、查詢數(shù)據(jù)。這樣一來(lái),運(yùn)維同學(xué)主要維護(hù)這套運(yùn)維控制臺(tái)系統(tǒng),并且不斷完善功能,輕松了不少。這就是研發(fā)兼運(yùn)維的DevOps時(shí)代。

Serverless時(shí)代

漸漸的,研發(fā)同學(xué)和運(yùn)維同學(xué)的關(guān)注點(diǎn)都在運(yùn)維控制臺(tái)了,運(yùn)維控制臺(tái)的功能越來(lái)越強(qiáng)大,比如根據(jù)運(yùn)維側(cè)的需求增加了自動(dòng)彈性擴(kuò)縮、性能監(jiān)控的功能,根據(jù)研發(fā)側(cè)的需求增加了自動(dòng)化發(fā)布的流水線功能。因?yàn)橛辛诉@套系統(tǒng),代碼質(zhì)量檢測(cè)、單元測(cè)試、打包編譯、部署、集成測(cè)試、灰度發(fā)布、彈性擴(kuò)縮、性能監(jiān)控、應(yīng)用防護(hù)這一系列服務(wù)端的工作基本上不需要人工參與處理了。這就是NoOps,Serverless時(shí)代。

Serverless在編程教育中的應(yīng)用

2020年注定是不平凡的一年,疫情期間,多少家企業(yè)如割韭菜般倒下,又有多少家企業(yè)如雨后春筍般茁壯成長(zhǎng),比如在線教育行業(yè)。

沒(méi)錯(cuò),在線教育行業(yè)是這次疫情的最大受益者,在在線教育在這個(gè)行業(yè)里,有一個(gè)細(xì)分市場(chǎng)是在線編程教育,尤其是少兒編程教育和面向非專(zhuān)業(yè)人士的編程教育,比如編程貓、斑馬AI、小象學(xué)院等。這些企業(yè)的在線編程系統(tǒng)都有一些共同的特點(diǎn)和訴求:

屏幕一側(cè)寫(xiě)代碼,執(zhí)行代碼,另一側(cè)顯示運(yùn)行結(jié)果。
根據(jù)題目編寫(xiě)的代碼都是代碼塊,每道題的代碼量不會(huì)很大。

運(yùn)行代碼的速度要快。
支持多種編程語(yǔ)言。
能支撐不可預(yù)計(jì)的流量洪峰沖擊。

例如小象學(xué)院的編程課界面:

結(jié)合上述這些特點(diǎn)和訴求,不難看出,構(gòu)建這樣一套在線編程系統(tǒng)的核心在于有一個(gè)支持多種編程語(yǔ)言的、健壯高可用的代碼運(yùn)行環(huán)境。

那么我們先來(lái)看看傳統(tǒng)的實(shí)現(xiàn)架構(gòu):

從High Level的架構(gòu)來(lái)看,前端只需要將代碼片段和編程語(yǔ)言的標(biāo)識(shí)傳給Server端即可,然后等待響應(yīng)展示結(jié)果。所以整個(gè)Server端要負(fù)責(zé)對(duì)不同語(yǔ)言的代碼進(jìn)行分類(lèi)、預(yù)處理然后傳給不同編程語(yǔ)言的Runtime。這種架構(gòu)有以下幾個(gè)比較核心的問(wèn)題。

工作量大,靈活性差

首先是研發(fā)和運(yùn)維工作量的問(wèn)題,當(dāng)市場(chǎng)有新的需求,或者洞察到新業(yè)務(wù)模式時(shí)需要增加編程語(yǔ)言,此時(shí)研發(fā)側(cè)需要增加編程代碼分類(lèi)和預(yù)處理的邏輯,另外需要構(gòu)建對(duì)應(yīng)編程語(yǔ)言的Runtime。在運(yùn)維側(cè)需要規(guī)劃支撐新語(yǔ)言的服務(wù)器規(guī)格以及數(shù)量,還有整體的CICD流程等。所以支持新的編程語(yǔ)言這個(gè)需求要落地,需要研發(fā)、運(yùn)維花費(fèi)不少的時(shí)間來(lái)實(shí)現(xiàn),再加上黑/白盒測(cè)試和CICD流程測(cè)試的時(shí)間,對(duì)市場(chǎng)需求的支撐不能快速的響應(yīng),靈活性相對(duì)較差。

高可用自己兜底

其次整個(gè)在線編程系統(tǒng)的穩(wěn)定性是重中之重。所以所有Server端服務(wù)的高可用架構(gòu)都需要自己搭建,用以保證流量高峰場(chǎng)景和穩(wěn)態(tài)場(chǎng)景下的系統(tǒng)穩(wěn)定。高可用一方面是代碼邏輯編寫(xiě)的是否優(yōu)雅和完善,另一方面是部署服務(wù)的集群,無(wú)論是ECS集群還是K8s集群,都需要研發(fā)和運(yùn)維同學(xué)一起規(guī)劃,那么對(duì)于對(duì)編程語(yǔ)言進(jìn)行分類(lèi)和預(yù)處理的服務(wù)來(lái)講,尚能給定一個(gè)節(jié)點(diǎn)數(shù),但是對(duì)于不同語(yǔ)言的Runtime服務(wù)來(lái)講,市場(chǎng)需求隨時(shí)會(huì)變,所以不好具體衡量每個(gè)服務(wù)的節(jié)點(diǎn)數(shù)。另外很重要的一點(diǎn)是所以服務(wù)的擴(kuò)容,縮容機(jī)制都需要運(yùn)維同學(xué)來(lái)實(shí)時(shí)手動(dòng)操作,即便是通過(guò)腳本實(shí)現(xiàn)自動(dòng)化,那么ECS彈起的速度也是遠(yuǎn)達(dá)不到業(yè)務(wù)預(yù)期的。

成本控制粒度粗

再次是整個(gè)IaaS資源的成本控制,我們都知道這種在線教育是有明顯的流量潮汐的,比如上午10點(diǎn)到12點(diǎn),下午3點(diǎn)到5點(diǎn),晚上8點(diǎn)到10點(diǎn)這幾個(gè)時(shí)段是流量比較大的時(shí)候,其他時(shí)間端流量比較小,而且夜晚更是沒(méi)什么流量。所以在這種情況下,傳統(tǒng)的部署架構(gòu)無(wú)法做到IaaS資源和流量的貼合。舉個(gè)例子,加入為了應(yīng)對(duì)流量高峰時(shí)期,需要20臺(tái)ECS搭建集群來(lái)承載流量沖擊,此時(shí)每臺(tái)ECS的資源使用率可能在70%以上,利用率較高,但是在流量小的時(shí)候和夜晚,每臺(tái)ECS的資源使用率可能就是百分之十幾甚至更低,這就是一種資源浪費(fèi)。

Serverless架構(gòu)

那么我們來(lái)看看如何使用Serverless架構(gòu)來(lái)實(shí)現(xiàn)同樣的功能,并且解決上述幾個(gè)問(wèn)題。在選擇Serverless產(chǎn)品時(shí),在國(guó)內(nèi)自然而然優(yōu)先想到的就是阿里云的產(chǎn)品。阿里云有兩款Serverless架構(gòu)的產(chǎn)品Serverless 應(yīng)用引擎和函數(shù)計(jì)算,這里我們使用函數(shù)計(jì)算來(lái)實(shí)現(xiàn)編程教育的場(chǎng)景。
函數(shù)計(jì)算(Function Compute)是事件驅(qū)動(dòng)的全托管計(jì)算服務(wù),簡(jiǎn)稱FC。使用函數(shù)計(jì)算,我們無(wú)需采購(gòu)與管理服務(wù)器等基礎(chǔ)設(shè)施,只需編寫(xiě)并上傳代碼。函數(shù)計(jì)算為您準(zhǔn)備好計(jì)算資源,彈性地、可靠地運(yùn)行任務(wù),并提供日志查詢、性能監(jiān)控和報(bào)警等功能。

這里不對(duì)FC的含義做過(guò)多贅述,只舉一個(gè)例子。FC中有兩個(gè)概念,一個(gè)是服務(wù),一個(gè)是函數(shù)。一個(gè)服務(wù)包含多個(gè)函數(shù):

這里拿Java微服務(wù)架構(gòu)來(lái)對(duì)應(yīng),可以理解為,FC中的服務(wù)是Java中的一個(gè)類(lèi),FC中的函數(shù)是Java類(lèi)中的一個(gè)方法:

但是Java類(lèi)中的方法固然只能是Java代碼,而FC中的函數(shù)可以設(shè)置不同語(yǔ)言的Runtime來(lái)運(yùn)行不同的編程語(yǔ)言:

這個(gè)結(jié)構(gòu)理解清楚之后,我們來(lái)看看如何調(diào)用FC的函數(shù),這里會(huì)引出一個(gè)觸發(fā)器的概念。我們最常使用的HTTP請(qǐng)求協(xié)議其實(shí)就是一種類(lèi)型的觸發(fā)器,在FC里稱為HTTP觸發(fā)器,除了HTTP觸發(fā)器以外,還提供了OSS(對(duì)象存儲(chǔ))觸發(fā)器、SLS(日志服務(wù))觸發(fā)器、定時(shí)觸發(fā)器、MNS觸發(fā)器、CDN觸發(fā)器等。

從上圖可以大概理解,我們可以通過(guò)多種途徑調(diào)用FC中的函數(shù)。舉例兩個(gè)場(chǎng)景,比如每當(dāng)我在指定的OSS Bucket的某個(gè)目錄下上傳一張圖片后,就可以觸發(fā)FC中的函數(shù),函數(shù)的邏輯是將剛剛上傳的圖片下載下來(lái),然后對(duì)圖片做處理,然后再上傳回OSS。再比如向MNS的某個(gè)隊(duì)列發(fā)送一條消息,然后觸發(fā)FC中的函數(shù)來(lái)處理針對(duì)這條消息的邏輯。

最后我們?cè)賮?lái)看看FC的高可用。每一個(gè)函數(shù)在運(yùn)行代碼時(shí)底層肯定還是IaaS資源,但我們只需要給每個(gè)函數(shù)設(shè)置運(yùn)行代碼時(shí)需要的內(nèi)存數(shù)即可,最小128M,最大3G,對(duì)使用者而言,不需要考慮多少核數(shù),也不需要知道代碼運(yùn)行在什么樣的服務(wù)器上,不需要關(guān)心啟動(dòng)了多少個(gè)函數(shù)實(shí)例,也不需要關(guān)心彈性擴(kuò)縮的問(wèn)題等,這些都由FC來(lái)處理。

從上圖可以看到,高可用有兩種策略:

給函數(shù)設(shè)置并發(fā)實(shí)例數(shù),假如設(shè)置為3,那么有三個(gè)請(qǐng)求進(jìn)來(lái)時(shí),該函數(shù)只啟一個(gè)實(shí)例,但是會(huì)啟三個(gè)線程來(lái)運(yùn)行邏輯。

線程數(shù)達(dá)到上限后,會(huì)再拉起一個(gè)函數(shù)實(shí)例。

大家看到這里,可能已經(jīng)大概對(duì)基于FC實(shí)現(xiàn)在線編程教育系統(tǒng)的架構(gòu)有了一個(gè)大概的輪廓。


上圖是基于FC實(shí)現(xiàn)的在線編程教育系統(tǒng)的架構(gòu)圖,在這個(gè)架構(gòu)下來(lái)看看上述那三個(gè)核心問(wèn)題怎么解:

  • 工作量和靈活性:我們只需要關(guān)注在如何執(zhí)行代碼的業(yè)務(wù)邏輯上,如果要加新語(yǔ)言,只需要?jiǎng)?chuàng)建一個(gè)對(duì)應(yīng)語(yǔ)言Runtime的FC函數(shù)即可。
  • 高可用:多線程運(yùn)行業(yè)務(wù)邏輯和多實(shí)例運(yùn)行業(yè)務(wù)邏輯兩層高可用保障,并且函數(shù)實(shí)例的擴(kuò)縮完全都是FC自動(dòng)處理,不需要研發(fā)和運(yùn)維同學(xué)做任何配置。
  • 成本優(yōu)化:當(dāng)沒(méi)有請(qǐng)求的時(shí)候,函數(shù)實(shí)例是不會(huì)被拉起的,此時(shí)也不會(huì)計(jì)費(fèi),所以在流量低谷期或者夜間時(shí),整個(gè)FC的成本消耗是非常低的。可以做到函數(shù)實(shí)例個(gè)數(shù)、計(jì)費(fèi)粒度和流量完美的貼合。

Python編程語(yǔ)言示例

下面以運(yùn)行Python代碼為例來(lái)看看如何用FC實(shí)現(xiàn)Python在線編程Demo。

創(chuàng)建服務(wù)和函數(shù)

打開(kāi)函數(shù)計(jì)算(FC)控制臺(tái),選擇對(duì)應(yīng)的Region,選擇左側(cè)服務(wù)/函數(shù),然后新建服務(wù):

輸出服務(wù)名稱,創(chuàng)建服務(wù)。

進(jìn)入新創(chuàng)建的服務(wù),然后創(chuàng)建函數(shù),選擇HTTP函數(shù),即可配置HTTP觸發(fā)器的函數(shù):

設(shè)置函數(shù)的各個(gè)參數(shù):

幾個(gè)需要的注意的參數(shù)這里做以說(shuō)明:

  • 運(yùn)行環(huán)境:這個(gè)很好理解,這里選擇Python3
  • 函數(shù)實(shí)例類(lèi)型:這里有彈性實(shí)例和性能實(shí)例兩種,前者最大支持2C3G規(guī)格的實(shí)例,后者支持更大的規(guī)格,最大到8C16G。
  • 函數(shù)入口:詳細(xì)參見(jiàn)文檔
  • HTTP觸發(fā)器認(rèn)證方式:anonymous為不需要鑒權(quán),function是需要鑒權(quán)的。

代碼解析

函數(shù)創(chuàng)建好,進(jìn)入函數(shù),可以看到概述、代碼執(zhí)行、觸發(fā)器、日志查詢等頁(yè)簽,我們先看觸發(fā)器,會(huì)看到這個(gè)函數(shù)自動(dòng)創(chuàng)建了一個(gè)HTTP觸發(fā)器,有調(diào)用該函數(shù)對(duì)應(yīng)的HTTP路徑:

然后我們選擇代碼執(zhí)行,直接在線寫(xiě)入我們的代碼:

具體代碼如下:

-- coding: utf-8 --

import logging
import urllib.parse
import time
import subprocess

def handler(environ, start_response):

context = environ['fc.context'] request_uri = environ['fc.request_uri'] for k, v in environ.items():if k.startswith('HTTP_'):pass try: request_body_size = int(environ.get('CONTENT_LENGTH', 0)) except (ValueError): request_body_size = 0 # 獲取用戶傳入的code request_body = environ['wsgi.input'].read(request_body_size) codeStr = urllib.parse.unquote(request_body.decode("GBK")) # 因?yàn)閎ody里的對(duì)象里有code和input兩個(gè)屬性,這里分別獲取用戶code和用戶輸入 codeArr = codeStr.split('&') code = codeArr[0][5:] inputStr = codeArr[1][6:] # 將用戶code保存為py文件,放/tmp目錄下,以時(shí)間戳為文件名 fileName = '/tmp/' + str(int(time.time())) + '.py' f = open(fileName, "w") # 這里預(yù)置引入了time庫(kù) f.write('import time \r\n') f = open(fileName, "a") f.write(code) f.close() # 創(chuàng)建子進(jìn)程,執(zhí)行剛才保存的用戶code py文件 p = subprocess.Popen("python " + fileName, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, encoding='utf-8') # 通過(guò)標(biāo)準(zhǔn)輸入傳入用戶的input輸入 if inputStr != '' :p.stdin.write(inputStr + "\n")p.stdin.flush() # 通過(guò)標(biāo)準(zhǔn)輸出獲取代碼執(zhí)行結(jié)果 r = p.stdout.read() status = '200 OK' response_headers = [('Content-type', 'text/plain')] start_response(status, response_headers) return [r.encode('UTF-8')]

整個(gè)代碼思路如下:

  • 從前端傳入代碼片段,格式是字符串。
  • 在FC函數(shù)中獲取到傳入的代碼字符串,截取code內(nèi)容和input的內(nèi)容。因?yàn)檫@里簡(jiǎn)單實(shí)現(xiàn)了Python中input交互的能力。
  • 將代碼保存為一個(gè)Python文件,以時(shí)間戳為文件名,保存在FC函數(shù)的/tmp目錄下。(每個(gè)FC函數(shù)都有獨(dú)立的/tmp目錄,可以存放臨時(shí)文件)
  • 然后在文件中追加了引入time庫(kù)的代碼,應(yīng)對(duì)sleep這種交互場(chǎng)景。
  • 通過(guò)subprocess創(chuàng)建子進(jìn)程,以Shell的方式通過(guò)Python命令執(zhí)行保存在/tmp目錄下的Python文件。如果有用戶輸入的信息,則通過(guò)標(biāo)準(zhǔn)輸入輸出寫(xiě)入子進(jìn)程。
  • 最后讀取執(zhí)行結(jié)果返回給前端。

前端代碼

前端我使用VUE寫(xiě)了簡(jiǎn)單的頁(yè)面,這里解析兩個(gè)簡(jiǎn)單的方法:

頁(yè)面加載時(shí)初始化HTTP請(qǐng)求對(duì)象,調(diào)用的HTTP路徑就是方才函數(shù)的HTTP觸發(fā)器的路徑。


這個(gè)方法就是調(diào)用FC中的PythonRuntime函數(shù),將前端頁(yè)面的代碼片段傳給該函數(shù)。這里處理input交互的思路是,掃描整個(gè)代碼片段,以包含input代碼為標(biāo)識(shí)將整個(gè)代碼段分成多段。沒(méi)有包含input代碼的直接送給FC函數(shù)執(zhí)行,包含input代碼的,請(qǐng)求用戶的輸入,然后代碼片段帶著用戶輸入的信息一起送給FC函數(shù)執(zhí)行。


演示如下:

結(jié)束語(yǔ)

這篇文章給大家介紹了Serverless,阿里云的Serverless產(chǎn)品函數(shù)計(jì)算(FC)以及基于函數(shù)計(jì)算(FC)實(shí)現(xiàn)的在線編程系統(tǒng)的Demo。大家應(yīng)該有所體感,基于函數(shù)計(jì)算(FC)實(shí)現(xiàn)在線編程系統(tǒng)時(shí),研發(fā)同學(xué)只需要專(zhuān)注在如何執(zhí)行由前端傳入的代碼即可,整個(gè)Server端的各個(gè)環(huán)節(jié)都不需要研發(fā)同學(xué)和運(yùn)維同學(xué)去關(guān)心,基本體現(xiàn)了Serverless的精髓。
基于Serverless還有很多其他的應(yīng)用場(chǎng)景,之后我會(huì)一一分享給大家,大家如果有任何疑問(wèn)也可以加入釘釘群35712134來(lái)尋找答案,我們不見(jiàn)不散!

原文鏈接:https://developer.aliyun.com/article/778418?

版權(quán)聲明:本文內(nèi)容由阿里云實(shí)名注冊(cè)用戶自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,阿里云開(kāi)發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。具體規(guī)則請(qǐng)查看《阿里云開(kāi)發(fā)者社區(qū)用戶服務(wù)協(xié)議》和《阿里云開(kāi)發(fā)者社區(qū)知識(shí)產(chǎn)權(quán)保護(hù)指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫(xiě)侵權(quán)投訴表單進(jìn)行舉報(bào),一經(jīng)查實(shí),本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。

總結(jié)

以上是生活随笔為你收集整理的Serverless在编程教育中的实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。