<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          美團Serverless產(chǎn)品落地與演進

          共 3338字,需瀏覽 7分鐘

           ·

          2021-09-13 02:55

          今天繼續(xù)大廠中間件系列,本期介紹的是美團的Serverless產(chǎn)品。


          美團的Serverless產(chǎn)品叫做Nest,誕生于2019年。其產(chǎn)品發(fā)展經(jīng)歷了三個階段:

          第一階段:快速驗證Serverless產(chǎn)品基本能力,涵蓋構(gòu)建、發(fā)布、彈性伸縮、對接觸發(fā)源、函數(shù)執(zhí)行等,通過一些業(yè)務(wù)試點接入驗證。

          第二階段:保障產(chǎn)品穩(wěn)定性問題,包括優(yōu)化彈性伸縮穩(wěn)定性、冷啟動速度、系統(tǒng)與業(yè)務(wù)可用性、容器穩(wěn)定性等工作。

          第三階段:完善生態(tài),如研發(fā)工具、上下游產(chǎn)品打通、平臺開放能力補齊等,促進產(chǎn)品業(yè)務(wù)收益。


          Serverle服務(wù)主要包含兩部分:FaaS、BaaS。

          FaaS:運行在一個無狀態(tài)的計算容器中d 函數(shù)服務(wù),通常由事件觸發(fā)、生命周期很短,由三方托管。


          BaaS:建立在云服務(wù)生態(tài)之上的后端服務(wù),美團內(nèi)部的中間件屬于這一范疇。


          由于彈性伸縮是Serverless平臺的必備能力,因此很多Serverless產(chǎn)品都是建立在K8S之上實現(xiàn)的,所以Nest也是將K8S作為基礎(chǔ)設(shè)施。


          在云原生領(lǐng)域Go是開發(fā)主流,美團主流語言是Java,所以Nest還是基于Java的。


          針對于函數(shù)之間的隔離性,NodeJs語言函數(shù)使用的是不同進程的隔離方式,Java采用的是類加載隔離,主要是Java進程占用內(nèi)存空間較NodeJs進程會大很多。


          Nest上函數(shù)執(zhí)行的過程:流量由EventTrigger觸發(fā)到Nest平臺(FaaS平臺),Nest平臺根據(jù)流量特征路由到具體函數(shù)實例,觸發(fā)函數(shù)執(zhí)行,函數(shù)內(nèi)部執(zhí)行可以調(diào)用公司各個BaaS服務(wù),最終函數(shù)執(zhí)行完成,返回結(jié)果。

          EventTrigger(事件觸發(fā)源)包括:Nginx、應(yīng)用網(wǎng)關(guān)、定時任務(wù)、消息隊列、RPC調(diào)用等。



          Nest架構(gòu)包含以下幾個部分:

          • 事件網(wǎng)關(guān):負責對接外部事件源流量,路由到函數(shù)實例上,同時負責統(tǒng)計各個函數(shù)進出流量信息,為彈性伸縮提供決策數(shù)據(jù)支撐。

          • 彈性伸縮:負責函數(shù)實例的彈性伸縮,根據(jù)運行的流量數(shù)據(jù)及實例閾值配置計算所需函數(shù)實例數(shù),借助K8S資源控制能力,調(diào)整實例數(shù)。

          • 控制器:負責K8S CRD控制邏輯實現(xiàn)。

          • 函數(shù)實例:函數(shù)運行實例,執(zhí)行函數(shù)代碼邏輯。

          • 治理平臺:面向用戶使用的平臺,負責函數(shù)構(gòu)建、版本、發(fā)布、函數(shù)元數(shù)據(jù)管理等。


          函數(shù)在Nest平臺執(zhí)行的流程包括:構(gòu)建、版本、部署、伸縮。

          • 構(gòu)建:開發(fā)人員編寫完代碼和配置依賴后,生成鏡像或可執(zhí)行文件。

          • 版本:構(gòu)建生成的鏡像或可執(zhí)行文件發(fā)布成一個不可變的版本。

          • 部署:將版本發(fā)布,完成部署。

          • 伸縮:根據(jù)函數(shù)實例流量及負載信息,進行實例彈性伸縮。


          區(qū)別于傳統(tǒng)部署過程,Serverless屏蔽了機器的概念,抽象了機器分組的概念。


          一個機器分組由:SET(單元化架構(gòu)標識,機器帶有)+ 泳道(測試環(huán)境隔離標識,機器帶有)+ 區(qū)域(上海、北京等)組成。


          用戶部署時,只需在相應(yīng)分組上操作,不涉及對具體機器的操作。


          函數(shù)是由事件觸發(fā)的,函數(shù)觸發(fā)流程如下:

          • 流量進入:先向事件源注冊事件網(wǎng)關(guān)信息,將流量引入到網(wǎng)關(guān),比如MQ事件源,通過注冊MQ消費組,引入MQ的流量到事件網(wǎng)關(guān)。

          • 流量適配:事件網(wǎng)關(guān)對事件源進入的流量適配對接。

          • 函數(shù)發(fā)現(xiàn):依據(jù)函數(shù)元數(shù)據(jù)(函數(shù)實例信息、配置信息等)獲取,類似于服務(wù)發(fā)現(xiàn)過程,事件網(wǎng)關(guān)將接收到的流量發(fā)送到具體函數(shù)實例,本質(zhì)是獲取K8S中內(nèi)置資源或CRD資源存儲的信息。

          • 函數(shù)路由:事件流量路由的過程,將流量路由到特定的函數(shù)實例上。為支持傳統(tǒng)路由(SET、泳道、區(qū)域路由)和版本路由能力,采用多層路由,第一層路由到分組(SET、泳道、區(qū)域路由),第二層路由到具體版本。基于版本路由可以輕易支持金絲雀、藍綠發(fā)布。


          FaaS服務(wù)執(zhí)行的是代碼片段,自身不能單獨執(zhí)行。函數(shù)的執(zhí)行首先需要的是函數(shù)環(huán)境。


          Nest基于K8S實現(xiàn),函數(shù)需要運行在K8S的Pod內(nèi),Pod內(nèi)是容器,容器里是運行時,運行時是函數(shù)流量接收的入口。


          不同流量下需要不同的實例數(shù),解決彈性伸縮需要考慮:什么時候伸縮、伸縮多少、伸縮速度要快。

          • 伸縮時機:根據(jù)流量Metrics實時計算函數(shù)期望實例數(shù),進行擴縮。流量的Metrics數(shù)據(jù)來源于事件網(wǎng)關(guān),主要統(tǒng)計函數(shù)并發(fā)度指標,彈性伸縮組件每秒鐘主動從事件網(wǎng)關(guān)獲取一次Metrics數(shù)據(jù)。

          • 伸縮算法:并發(fā)度 / 單機實例閾值 = 期望實例數(shù),收集Metrics數(shù)據(jù)及業(yè)務(wù)配置的閾值,通過算法計算出期望的實例數(shù),然后通過K8S接口設(shè)置具體實例數(shù)。

          • 伸縮速度:主要取決于冷啟動時間。


          函數(shù)實例還支持0實例,當函數(shù)無實例時,事件網(wǎng)關(guān)會將函數(shù)請求流量緩存下來,同時立即通過流量Metrics驅(qū)動彈性伸縮組件進行擴容,等實例啟動完成后,將緩存的請求重試到擴容的實例上觸發(fā)函數(shù)執(zhí)行。


          當前技術(shù)做不到毫秒級別的伸縮,因此在線上實際場景中,彈性伸縮不及預期時,會導致服務(wù)穩(wěn)定性問題。

          • 實例伸縮頻繁問題:在伸縮組件中增加了統(tǒng)計數(shù)據(jù)滑動窗口,通過計算均值來平滑指標,同時延時縮容,同時增加了QPS指標伸縮策略,QPS指標和并發(fā)度更穩(wěn)定一些。

          • 擴容來不及問題:系統(tǒng)支持了提前擴容方式,當達到實例閾值的70%就擴容,可以比較好的緩解這個問題,同時結(jié)合多個指標(并發(fā)度、QPS、CPU、內(nèi)存)伸縮。


          函數(shù)實例擴容之后有一段冷啟動時間,包括了資源調(diào)度、鏡像/代碼下載、啟動容器、運行時初始化、代碼初始化等工作,這些工作完成之后才可以執(zhí)行函數(shù),冷啟動時間決定了彈性伸縮的速度。


          平臺還需要具備高可用能力,包括平臺本身高可用及宿主在平臺之上的函數(shù)的高可用。


          平臺高可用從架構(gòu)層、服務(wù)層、監(jiān)控運營層、業(yè)務(wù)視角層保障。


          架構(gòu)層對于有狀態(tài)的服務(wù)(彈性伸縮模塊),采用了主從架構(gòu),當主節(jié)點異常時,從節(jié)點立即替換。


          同時架構(gòu)上橫向地域隔離,K8S兩地兩集群強隔離,服務(wù)(事件網(wǎng)關(guān)、彈性伸縮)集群內(nèi)兩地弱隔離(上海彈性伸縮只負責上海K8S集群內(nèi)的業(yè)務(wù)彈性伸縮,事件網(wǎng)關(guān)調(diào)度兩地K8S集群)。


          同時縱向上采用業(yè)務(wù)線強隔離,不同業(yè)務(wù)線使用不同集群,K8S層資源采用namespace實現(xiàn)業(yè)務(wù)線弱隔離。


          服務(wù)層的網(wǎng)關(guān)服務(wù),由于所有函數(shù)流量都經(jīng)過事件網(wǎng)關(guān),因此事件網(wǎng)關(guān)可用性非常重要,這層支持了異步和限流,保障服務(wù)的穩(wěn)定性。


          運營監(jiān)控層是完善監(jiān)控告警、梳理核心鏈路推動相關(guān)依賴方進行治理,定期梳理SOP通過故障演練發(fā)現(xiàn)系統(tǒng)隱患。


          業(yè)務(wù)視角層需要在線不間斷巡檢,模擬用戶函數(shù)請求流量,實時監(jiān)測系統(tǒng)核心鏈路是否正常。


          函數(shù)高可用包括:業(yè)務(wù)降級、限流能力,當后端函數(shù)故障時,可通過配置降級,返回降級結(jié)果。針對異常的函數(shù)流量,平臺限制其流量,防止后端函數(shù)實例被異常流量打掛。


          當實例異常時,平臺自動隔離該實例并擴容新實例,平臺支持業(yè)務(wù)多區(qū)部署,將函數(shù)實例打散到不同機房。當宿主機、機房、地區(qū)故障時,會立即在可用宿主機、可用機房、可用區(qū)重建實例。平臺同時提供函數(shù)運行時的時延、成功率、實例伸縮、請求數(shù)等多種指標監(jiān)控,當指標不符合預期時,自動告警給負責人。



          為提高新擴容實例的穩(wěn)定性,將運維相關(guān)的Agent放到Sidecar容器中,業(yè)務(wù)進程單獨在容器中,通過這種容器隔離機制,解決了異常CPU、資源搶占問題,保障了業(yè)務(wù)穩(wěn)定性。


          Serverless產(chǎn)品少不了開發(fā)工具,一般是WebIDE,支持在線一站式代碼修改、構(gòu)建、發(fā)布、測試。


          同時平臺還完善了函數(shù)的編排,通過OpenAPI開放了資源池,讓業(yè)務(wù)自定義資源池。


          Serverless收益還是主要圍繞于彈性伸縮的降低成本,提高資源利用率。比如高頻業(yè)務(wù)可以收益40%~50%,低頻業(yè)務(wù)通過合并部署,極大降低成本。


          提升研發(fā)效率上,讓研發(fā)同學聚焦于業(yè)務(wù)本身,快速研發(fā)、測試,依托于完備的在線日志與監(jiān)控能力,提高了需求上線速度。


          未來工作圍繞于將傳統(tǒng)的Java微服務(wù)Serverless化,考慮結(jié)合服務(wù)治理體系,如ServiceMesh和Serverless相結(jié)合,Mesh為Serverless提供伸縮指標,在伸縮過程中基于Mesh實現(xiàn)精準的流量調(diào)配。

          瀏覽 74
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费av毛片 | 日韩AV电影在线观看 | 久久色无码视频 | 无码AV成人导航网站 | 国产成人免费在线视频 |