Flink StateFunction:集成了Flink和FaaS的流處理優(yōu)點(diǎn)
點(diǎn)擊上方藍(lán)色字體,選擇“設(shè)為星標(biāo)”

近日,有狀態(tài)函數(shù)(Stateful Functions , statefun.io )宣布開源,它可以極大降低構(gòu)建和編排分布式有狀態(tài)應(yīng)用程序的復(fù)雜性,集成了 Apache Flink 和函數(shù)即服務(wù)(Function-as-a-Service,F(xiàn)aaS)的流處理優(yōu)點(diǎn),為下一代事件驅(qū)動(dòng)架構(gòu)提供了強(qiáng)大的抽象能力。這篇博客將為開發(fā)者介紹有狀態(tài)函數(shù)產(chǎn)生的原因、概念以及如何使用。
問題:有狀態(tài)應(yīng)用仍然很難
在 Kubernetes 和 FaaS 等技術(shù)的推動(dòng)下,無狀態(tài)計(jì)算的編排已經(jīng)取得了長(zhǎng)足進(jìn)步,但是由于大多數(shù)產(chǎn)品主要關(guān)注的是計(jì)算,而不是狀態(tài),所以當(dāng)涉及到有狀態(tài)的分布式應(yīng)用程序時(shí),這些技術(shù)仍然不能很好得滿足要求。此外,函數(shù)之間的交互仍然會(huì)為開發(fā)的整體易用性和分布式數(shù)據(jù)的一致性帶來挑戰(zhàn)。
Stateful Functions 是專門為突破這些限制而構(gòu)建的,它讓開發(fā)者能夠定義松耦合、獨(dú)立的函數(shù),這些函數(shù)占用空間很小,可以在共享資源池中進(jìn)行一致且可靠的交互。該框架由實(shí)現(xiàn)“Stateful Functions”的抽象 API(圖 1)和基于 Apache Flink 用于分布式協(xié)調(diào)、通信和狀態(tài)管理的運(yùn)行時(shí)組成。
Stateful Functions API
該 API 基于 Stateful Functions,封裝了業(yè)務(wù)邏輯的小功能片段,有點(diǎn)類似于 actors 。這些函數(shù)以虛擬實(shí)例的形態(tài)存在,虛擬實(shí)例通常是指應(yīng)用程序中的每個(gè)實(shí)體(例如,每個(gè)用戶都有一個(gè)虛擬實(shí)例),并且這些函數(shù)分布在碎片上,從而使應(yīng)用程序具有開箱即用的水平可伸縮性。每個(gè)函數(shù)在局部變量中都有持久的用戶定義狀態(tài),并且可以隨意向其他函數(shù)(包括它自己)發(fā)送消息,并能保證只發(fā)送一次。
運(yùn)行時(shí)(Runtime)
支持 Stateful Functions 的運(yùn)行時(shí)是基于 Apache Flink 流處理的。狀態(tài)保存在流處理引擎中,與計(jì)算位于同一位置,并能提供快速且一致的狀態(tài)訪問。狀態(tài)的持久性和容錯(cuò)性是建立在 Flink 具有魯棒性的分布快照模型上的。

計(jì)算狀態(tài),而不是根據(jù)狀態(tài)計(jì)算
該框架不是為了替代 FaaS 或者 Serverless,相反,Stateful Functions 的目的是提供一組類似于 Serverless 計(jì)算屬性的功能,但這些功能是用于解決以狀態(tài)為中心的問題。
以狀態(tài)為中心(State-centric)
有狀態(tài)函數(shù)主要用于衡量狀態(tài)和不同狀態(tài)與事件之間的交互,以促進(jìn)這些交互的邏輯作為計(jì)算的主要焦點(diǎn)。事件驅(qū)動(dòng)的應(yīng)用程序需要處理交互狀態(tài)機(jī)并且記錄上下文信息,這非常適合以狀態(tài)為中心的范例。
以計(jì)算為中心(Compute-centric)
另一方面,F(xiàn)aaS 和 Serverless 應(yīng)用程序框架主要擅長(zhǎng)彈性擴(kuò)展專用計(jì)算資源。與狀態(tài)和其他函數(shù)的交互,整合的不是很好,當(dāng)然這也不是它們的核心優(yōu)勢(shì)。擬合用例中一個(gè)很好的例子是經(jīng)典的“使 AWS Lambda 實(shí)現(xiàn)鏡像的伸縮”。

為了實(shí)現(xiàn)這一點(diǎn),Stateful Functions API 下的運(yùn)行時(shí)依賴于 Apache Flink 的流處理,并且擴(kuò)展了其強(qiáng)大的狀態(tài)管理和容錯(cuò)模型。容錯(cuò)模型的主要優(yōu)點(diǎn)是狀態(tài)和計(jì)算共存于同一網(wǎng)絡(luò),這意味著不需要記錄每次往返,就可從外部存儲(chǔ)系統(tǒng)(如 Cassandra、DynamoDB)中獲取狀態(tài),也不需要使用特定的狀態(tài)管理模式來實(shí)現(xiàn)一致性(如事件源、CQRS)。其他優(yōu)點(diǎn)還包括:
不需要管理動(dòng)態(tài)消息,也不需要維護(hù)復(fù)雜的復(fù)制或重新分區(qū)策略,因?yàn)槌志眯院蜑闋顟B(tài)快照提供對(duì)象存儲(chǔ)一樣簡(jiǎn)單;
流(快速實(shí)時(shí))處理和批(離線)處理的高吞吐量允許開發(fā)者模糊事件驅(qū)動(dòng)應(yīng)用程序和通用數(shù)據(jù)處理之間的界限。
Stateful Functions 對(duì)計(jì)算和存儲(chǔ)的劃分與經(jīng)典的兩層架構(gòu)不同,它維護(hù)了一個(gè)短暫的狀態(tài) / 計(jì)算層(Apache Flink)和一個(gè)簡(jiǎn)單的持久化 blob 存儲(chǔ)層(圖 2)。在編程上,持久性是基于持久化值的概念,這使得每個(gè)函數(shù)實(shí)例都能夠獨(dú)立維護(hù)和跟蹤容錯(cuò)狀態(tài)。
擴(kuò)展流處理范圍
盡管Stateful Functions API 獨(dú)立于Flink,但運(yùn)行時(shí)是在Flink 的 DataStream API 之上構(gòu)建的,并且使用了輕量版的過程函數(shù)(即訪問狀態(tài)的低級(jí)函數(shù))來實(shí)現(xiàn)底層抽象。與vanilla Flink 相比,核心優(yōu)勢(shì)在于函數(shù)可以任意將事件發(fā)送給其他函數(shù),而不僅僅是DAG 的下游。

Stateful Functions 應(yīng)用程序通常是模塊化的,包含了多個(gè)函數(shù)包,這些函數(shù)包可以一致且可靠地交互,并復(fù)用到一個(gè) Flink 應(yīng)用程序上(圖 3)。這使得許多小工作可以共享相同的資源池,并根據(jù)需要加以利用,而無需預(yù)訂高峰時(shí)可能需要的資源。在任何時(shí)候,絕大多數(shù)虛擬實(shí)例都是空閑的,不會(huì)消耗任何計(jì)算資源。

版權(quán)聲明:
文章不錯(cuò)?點(diǎn)個(gè)【在看】吧!??




