Stateful Functions開源:集成了Flink和FaaS的流處理優點

近日,有狀態函數(Stateful Functions ,statefun.io)宣佈開源,它可以極大降低構建和編排分佈式有狀態應用程序的複雜性,集成了Apache Flink和函數即服務(Function-as-a-Service,FaaS)的流處理優點,爲下一代事件驅動架構提供了強大的抽象能力。這篇博客將爲開發者介紹有狀態函數產生的原因、概念以及如何使用。

問題:有狀態應用仍然很難

在Kubernetes和 FaaS等技術的推動下,無狀態計算的編排已經取得了長足進步,但是由於大多數產品主要關注的是計算,而不是狀態,所以當涉及到有狀態的分佈式應用程序時,這些技術仍然不能很好得滿足要求。此外,函數之間的交互仍然會爲開發的整體易用性和分佈式數據的一致性帶來挑戰。

Stateful Functions是專門爲突破這些限制而構建的,它讓開發者能夠定義鬆耦合、獨立的函數,這些函數佔用空間很小,可以在共享資源池中進行一致且可靠的交互。該框架由實現“Stateful Functions”的抽象API(圖1)和基於Apache Flink用於分佈式協調、通信和狀態管理的運行時組成。

Stateful Functions API

該API基於Stateful Functions,封裝了業務邏輯的小功能片段,有點類似於actors。這些函數以虛擬實例的形態存在,虛擬實例通常是指應用程序中的每個實體(例如,每個用戶都有一個虛擬實例),並且這些函數分佈在碎片上,從而使應用程序具有開箱即用的水平可伸縮性。每個函數在局部變量中都有持久的用戶定義狀態,並且可以隨意向其他函數(包括它自己)發送消息,並能保證只發送一次。

運行時(Runtime)

支持Stateful Functions的運行時是基於Apache Flink流處理的。狀態保存在流處理引擎中,與計算位於同一位置,並能提供快速且一致的狀態訪問。狀態的持久性和容錯性是建立在Flink具有魯棒性的分佈快照模型上的。

圖1

計算狀態,而不是根據狀態計算

該框架不是爲了替代FaaS或者Serverless,相反,Stateful Functions的目的是提供一組類似於Serverless計算屬性的功能,但這些功能是用於解決以狀態爲中心的問題。

以狀態爲中心(State-centric)

有狀態函數主要用於衡量狀態和不同狀態與事件之間的交互,以促進這些交互的邏輯作爲計算的主要焦點。事件驅動的應用程序需要處理交互狀態機並且記錄上下文信息,這非常適合以狀態爲中心的範例。

以計算爲中心(Compute-centric)

另一方面,FaaS和Serverless應用程序框架主要擅長彈性擴展專用計算資源。與狀態和其他函數的交互,整合的不是很好,當然這也不是它們的核心優勢。擬合用例中一個很好的例子是經典的“使AWS Lambda實現鏡像的伸縮”。

圖2

爲了實現這一點,Stateful Functions API 下的運行時依賴於Apache Flink的流處理,並且擴展了其強大的狀態管理容錯模型。容錯模型的主要優點是狀態和計算共存於同一網絡,這意味着不需要記錄每次往返,就可從外部存儲系統(如Cassandra、DynamoDB)中獲取狀態,也不需要使用特定的狀態管理模式來實現一致性(如事件源、CQRS)。其他優點還包括:

  • 不需要管理動態消息,也不需要維護複雜的複製或重新分區策略,因爲持久性和爲狀態快照提供對象存儲一樣簡單;
  • 流(快速實時)處理和批(離線)處理的高吞吐量允許開發者模糊事件驅動應用程序和通用數據處理之間的界限。

Stateful Functions對計算和存儲的劃分與經典的兩層架構不同,它維護了一個短暫的狀態/計算層(Apache Flink)和一個簡單的持久化blob存儲層(圖2)。在編程上,持久性是基於持久化值的概念,這使得每個函數實例都能夠獨立維護和跟蹤容錯狀態。

擴展流處理範圍

儘管Stateful Functions API 獨立於Flink,但運行時是在Flink的DataStream API之上構建的,並且使用了輕量版的過程函數(即訪問狀態的低級函數)來實現底層抽象。與vanilla Flink相比,核心優勢在於函數可以任意將事件發送給其他函數,而不僅僅是DAG的下游。

圖3

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

結束語

如果開發者對這個項目感興趣,可以進行嘗試,建議開始前先查閱文檔並遵從介紹演練,從簡單的有狀態的“Hello World!”(圖4)到更復雜的拼車應用程序。如果發現了bug或有其他改進想法,建議通過GitHub提交問題或打開pull請求。任何時候,開發者都可以用#statefun標籤向項目創建者詢問堆棧溢出問題。

圖4

Stateful Functions是一項正在進行中的工作,未來將持續改進來建立和擴大價值,例如支持非JVM語言、細粒度的可觀察性和更嚴格的恢復時間。對運行時和操作進行增強的可能性也會隨着Apache Flink的發展而完善。該項目創建者的目標是爲Apache軟件基金會(Apache Software Foundation)貢獻Stateful Functions,並使其成爲Apache Flink的一部分,在一個開放的社區中發展,與開發者密切合作,解決真實的問題,這是學習和成長的最佳方式,然而是否接受這個項目最終取決於Flink社區。

原文鏈接:

https://www.ververica.com/blog/announcing-stateful-functions-distributed-state-uncomplicated

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章