使用Knative和Python的構建無伺服器事件驅動的應用 - Ron Nagar
Knative的一個擴充套件Kubernetes,它提供了一套工具來部署無伺服器的工作量。
Knative由以下主要元件構建:
在本文中,我們將重點介紹Eventing元件。它為無伺服器事件驅動架構提供基礎架構,在觸發事件時執行容器。Knative Eventing支援不同的事件源(例如GitHub事件,Pub / Sub等),您甚至可以編寫自己的自定義事件源。
我們之所以選擇Knative而不是其他傳統的無伺服器平臺(Functions,Lambda等),原因如下:
- 它由容器驅動,這意味著您可以在每種語言或框架中編寫您喜歡的程式碼,只要您可以從中建立容器。通常,其他無伺服器平臺將您限制為它們支援的特定執行時環境。
- 資源是完全可定製的(CPU,GPU,網路等),只要您的Kubernetes叢集配備了您可以使用的相關資源。就像每個Kubernetes部署一樣,您必須說明您需要哪些資源。其他無伺服器解決方案限制了資源,這些限制對我們來說通常是不行的。
- 沒有超時限制,因此您可以部署長時間執行的程式(資料分析,影象處理等等)。使用其他無伺服器平臺無法實現這一點,因為它們通常具有超時限制。
- Eventing元件使用cloudevents作為釋出事件的規範。基本上,它可以幫助我們編寫事件源無關的程式碼。我們只需要瞭解事件的有效負載,但不必直接與事件源整合或以不同方式解析事件。
然而,它不是所有的玫瑰和蝴蝶,我們還必須提到缺點。Knative仍處於非常早期階段(截至今日最新版本為0.6),這意味著API可能會在此過程中發生變化,升級可能會破壞您的部署。與其他無伺服器解決方案相比,編寫所有這些Kubernetes YAML並安裝所有內容更加麻煩。
這就是為什麼我們將Knative與其自己的叢集隔離,並且不要將我們的日常叢集與Knative叢集混合。我們將相關服務與VPC和負載均衡器連線起來。
Knative Eventing和Python
我們使用Knative的主要用例是在新資料到達系統時執行長CPU限制資料分析過程。作為大多數資料分析任務,我們的資料科學團隊使用Python編寫。不幸的是,Knative Eventing示例是Go編寫,其中唯一可用於輕鬆引導Knative Eventing專案的庫也是Go。
我們知道我們必須為Python建立一個類似的開源庫,以便其他人也可以使用它。經過一些研究並深入研究Go庫程式碼,我們意識到我們需要實現的只是一個HTTP伺服器,它監聽POST請求並解析cloudevents有效負載。在幕後,Knative Eventing使用Knative Serving,並在一個事件中向Knative Eventing容器發出POST請求。我們很高興分享我們的開源專案,python-kncloudevents,用於輕鬆整合Python和Knative Eventing
python-kncloudevents的用法非常簡單,你需要做的就是編寫一個接收cloudevents作為引數的函式。要訪問事件資料,您只需呼叫cloudevent的Data函式即可。現在要在事件觸發時執行您的函式,您只需要建立CloudeventsServer例項並執行接受您的函式的start_receiver函式。
import sys from kncloudevents import CloudeventsServer import logging logging.basicConfig(stream=sys.stdout, level=logging.INFO) def run_event(event): try: logging.info(event.Data()) except Exception as e: logging.error(f"Unexpected error: {e}") raise client = CloudeventsServer() |
結論
Knative非常適合構建無需資源的工作負載,這需要資源,執行時和持續時間的靈活性。Knative允許構建與依賴項和環境無關的事件驅動架構。
如果您需要執行需要定製環境的基於事件的流程,Knative是您的正確選擇。如果您想構建快速簡單的功能,那麼像Functional或Lambda這樣的託管無伺服器平臺也可能適合您。
相關文章
- 使用Knative基於構建、部署、管理serverless應用Server
- 使用 Micronaut和OpenFaaS 構建無伺服器Java 應用程式 - openvalue伺服器Java
- 事件匯流排 + 函式計算構建雲上最佳事件驅動架構應用事件函式架構
- 六邊形架構:使用事件驅動的無伺服器實現鬆耦合 - Ellerby架構事件伺服器
- 六邊形架構:使用事件驅動的無伺服器實現松耦合 - Ellerby架構事件伺服器
- 無伺服器事件驅動系統伺服器事件
- 使用 Postgres 的全文搜尋構建可擴充套件的事件驅動搜尋架構套件事件架構
- 驅動學習之驅動和應用的介面
- 使用 Redis 和 Python 構建一個共享單車的應用程式RedisPython
- 【譯】使用 Webpack 和 Poi 構建更好的 JavaScript 應用WebJavaScript
- [譯] 使用Capacitor 和 Vue.js 構建移動應用Vue.js
- 事件驅動架構EDA中的元件事件架構元件
- 混合雲中的事件驅動架構事件架構
- 基於 ASK + EB 構建容器事件驅動服務事件
- 事件驅動的微服務-事件驅動設計事件微服務
- 使用Rust和WebAssembly構建Web應用程式RustWeb
- 使用Java和Reactive Streams構建流式應用JavaReact
- Judo:使用無程式碼構建原生應用體驗
- 一種使用 Redis 深度驅動的,為構建輕量級分散式應用程式(Microservices)的工程方案Redis分散式ROS
- 使用 webpack 構建應用Web
- 使用汽車應用庫構建應用
- 使用Backbone構建精美應用的7條建議
- 精簡化事件:事件驅動架構的精益力量事件架構
- 構建一個基於事件分發驅動的EventLoop執行緒模型事件OOP執行緒模型
- WebSphere Business Events 構建業務事件應用程式Web事件
- 構建無縫整合的gRPC-Web和Istio的雲原生應用教程RPCWeb
- 事件驅動架構設計事件架構
- 使用 Dash 庫構建可互動的資料展示 Web 應用Web
- 使用新的LunchBadger 14天試用版構建基於無伺服器的功能伺服器
- 無伺服器管道:將MySQL事件流傳輸到Knative Services - zhaw伺服器MySql事件
- RocketMQ 事件驅動:雲時代的事件驅動有啥不同?MQ事件
- 使用Java和Spring MVC構建Web應用JavaSpringMVCWeb
- 使用Spring Boot和GraalVM在Knative上構建微服務 - piotrSpring BootLVM微服務
- 使用 jQuery UI 和 jQuery 外掛構建更好的 Web 應用程式jQueryUIWeb
- 使用Electron構建跨平臺的桌面應用
- 使用React構建大型應用的最佳實踐React
- 驅動和應用層的三種通訊方式
- 使用Apache Spark和BigDL來構建深度學習驅動的大資料分析ApacheSpark深度學習大資料