新聞中心
“Serverless(無服務(wù)器)”有很多令人興奮的地方,包括對其確切含義的爭論(例如,考慮到代碼仍然在某個服務(wù)器上運行,“Serverless”是否是一個有意義的名稱)。

公司主營業(yè)務(wù):成都網(wǎng)站制作、網(wǎng)站設(shè)計、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出閬中免費做網(wǎng)站回饋大家。
不管“Serverless”確切定義如何,Serverless的基本思想是通過將開發(fā)人員與執(zhí)行他們創(chuàng)建的編程邏輯的基礎(chǔ)結(jié)構(gòu)分離,達(dá)到簡化開發(fā)人員生活的目的。
與傳統(tǒng)單體式應(yīng)用程序開發(fā)中的開發(fā)人員的體驗不同,在傳統(tǒng)單體式應(yīng)用程序開發(fā)中,開發(fā)人員往往要花費大量時間考慮其代碼如何與整個應(yīng)用程序的體系結(jié)構(gòu)和操作進(jìn)行集成和交互。
相比之下,Serverless的承諾是,開發(fā)人員只需通過一個簡單的API和抽象,專心關(guān)注他們的邏輯實現(xiàn),而由基礎(chǔ)架構(gòu)和操作團(tuán)隊負(fù)責(zé)處理和執(zhí)行該邏輯的環(huán)境。
目前市場上已經(jīng)存在不少通用型無服務(wù)器框架,但是,相同的概念也可以應(yīng)用于更具體的技術(shù)支持方面。
現(xiàn)在我們來說一說"流處理"。流處理傳統(tǒng)上是專用流處理引擎(SPE,即“specialized stream processing engines”)的領(lǐng)域,如Apache Storm、Apache Heron 等。這些SPE提供了復(fù)雜的框架和執(zhí)行模型,能夠執(zhí)行各種各樣的處理。
流處理的方法主要基于函數(shù)編程概念(如map、flatmap等)和將處理流編譯成有向無環(huán)圖(DAG)等思想,同時,流處理的方法也融入了許多混合流處理系統(tǒng),包括Apache Spark Streaming、Apache Kafka Streams和Apache Flink。盡管這些框架功能強(qiáng)大且靈活,但大多數(shù)開發(fā)人員都不熟悉這些框架,學(xué)習(xí)起來相當(dāng)繁瑣。另一方面,運營團(tuán)隊在生產(chǎn)中管理起來也很復(fù)雜。
總之,復(fù)雜性和開銷一直是數(shù)據(jù)處理中運用流技術(shù)的一個重要障礙。
然而,新技術(shù)正在將無服務(wù)器概念引入流處理領(lǐng)域。在本文中,我們將探討Pulsar函數(shù)如何將無服務(wù)器概念引入Apache Pulsar消息傳遞系統(tǒng)內(nèi)的流處理中。
流處理的方法主要基于函數(shù)編程概念(如map、flatmap等)和將處理流編譯成有向無環(huán)圖(DAG)等思想,同時,流處理的方法也融入了許多混合流處理系統(tǒng),包括Apache Spark Streaming、Apache Kafka Streams和Apache Flink。盡管這些框架功能強(qiáng)大且靈活,但大多數(shù)開發(fā)人員都不熟悉這些框架,學(xué)習(xí)起來相當(dāng)繁瑣。另一方面,運營團(tuán)隊在生產(chǎn)中管理起來也很復(fù)雜。
很多數(shù)據(jù)處理應(yīng)用的場景是簡單和輕量級的。簡單的ETL(提取、轉(zhuǎn)換和加載)操作、基于事件的服務(wù)、實時聚合和事件路由都是不需要復(fù)雜拓?fù)浠蛱幚砜蚣艿膽?yīng)用場景。
雖然這些應(yīng)用場景可以使用SPE(專用流處理引擎)實現(xiàn),但開發(fā)人員和用戶一直受到以下問題的困擾:
1.設(shè)置一個單獨的流處理集群太復(fù)雜和繁重,尤其是考慮到用戶只需要SPE功能的一小部分時;
2.對于這種簡單的處理來說,操作成本太高,這是因為成熟的SPE有很多特性,以致于它們在部署、監(jiān)控和維護(hù)方面自然具有很高的復(fù)雜性;
3.對于大多數(shù)簡單的應(yīng)用場景來說,成熟SPE的API過于復(fù)雜和復(fù)雜,許多SPE都有基于函數(shù)編程模型的API(例如map、flatmap、reduce等),這些API可能是一個強(qiáng)大的工具,但對于許多應(yīng)用場景,尤其是如果用戶對函數(shù)式編程范式不熟悉時,這一方案可能顯得過于復(fù)雜和笨拙。
Pulsar函數(shù)的創(chuàng)建使得在流數(shù)據(jù)上開發(fā)和部署處理邏輯更加容易。其開發(fā)具有以下設(shè)計目標(biāo)。
1.簡單API:任何有能力用受支持的語言編寫函數(shù)的人都應(yīng)該能夠在幾分鐘內(nèi)完成工作;
2.多語言:支持Java、Scala、Python、Go和JavaScript等流行編程語言;
3.內(nèi)置狀態(tài)管理功能:為了簡化開發(fā)人員的體系架構(gòu),應(yīng)該允許在計算過程中,讓計算保持狀態(tài)。系統(tǒng)應(yīng)該以穩(wěn)固的方式保持這種狀態(tài),諸如遞增、獲取、存儲和更新功能等基本功能是必需的;
4.托管運行時:開發(fā)人員不必?fù)?dān)心在何處以及如何運行計算,開發(fā)人員只需提交他/她的計算,系統(tǒng)就會運行之:
5.自動負(fù)載平衡:托管運行時應(yīng)負(fù)責(zé)為函數(shù)分配工作線程。
6.可調(diào)整:用戶應(yīng)該能夠使用托管運行時調(diào)整函數(shù)實例的數(shù)量。
7.容錯:托管運行時還應(yīng)以可靠和容錯的方式運行開發(fā)人員的計算,以便最大限度地減少停機(jī)時間。
8.多租戶:不同的計算應(yīng)該相互隔離。開發(fā)人員應(yīng)指定其計算所需的資源量,運行時將強(qiáng)制執(zhí)行這些資源配額。
9.靈活的部署模型:計算應(yīng)能夠作為線程、進(jìn)程、docker容器等運行。此外,它們還應(yīng)支持在Kubernetes等外部調(diào)度程序上運行。
什么是Pulsar函數(shù)?
Pulsar函數(shù)是一個輕量級的處理框架,位于Apache Pulsar消息傳遞和流媒體平臺內(nèi)部。Pulsar函數(shù)的靈感不僅來自Apache Heron和Apache Storm等流處理引擎,還受到AWS Lambda和Google云函數(shù)等函數(shù)即服務(wù)(FaaS)產(chǎn)品的影響。
Pulsar函數(shù)可以使用Java、Python等通用語言編寫處理函數(shù),并將這些函數(shù)部署到Pulsar集群,并不需要使用復(fù)雜的SDK。Pulsar負(fù)責(zé)設(shè)置函數(shù)的執(zhí)行環(huán)境,提供彈性支持,并確保遵循消息傳遞保證。處理邏輯可以是在函數(shù)中容納的任何內(nèi)容,包括數(shù)據(jù)轉(zhuǎn)換、動態(tài)路由、數(shù)據(jù)豐富(data enrichment)、數(shù)據(jù)分析等。
總之,Pulsar函數(shù)的美妙之處在于,開發(fā)者可以享受SPE(服務(wù)資源調(diào)配環(huán)境,即“Service Provisioning Environment”)的好處,而無需部署SPE。如果開發(fā)者已經(jīng)在使用SPE或仍然需要部署SPE,那么可以輕松地將Pulsar連接到任何流處理引擎(包括Apache Spark Streaming、Apache Storm、Apache Heron或Apache Flink)。
脈沖星函數(shù)的工作原理
Pulsar函數(shù)使用來自一個或多個Pulsar主題的數(shù)據(jù),支持使用自定義邏輯處理數(shù)據(jù)。
并且,在必要時支持使用簡單的API將結(jié)果寫入其他Pulsar主題。同一個Pulsar函數(shù)的一個或多個實例能夠執(zhí)行用戶定義的處理邏輯。其中,一個函數(shù)可以使用提供的狀態(tài)接口來持久化中間結(jié)果,而其他函數(shù)負(fù)責(zé)查詢該狀態(tài)以檢索這些結(jié)果。
在最簡單的情況下,您甚至不需要SDK來實現(xiàn)Pulsar函數(shù)。例如,在Java中,用戶可以僅實現(xiàn)只有一個apply方法的java.util.function.Function接口。下面是一個Pulsar函數(shù)的示例,該函數(shù)對消息應(yīng)用了一種簡單的轉(zhuǎn)換操作(在字符串中添加一個字符“!”):
import java.util.Function;
public class ExclamationFunction implements Function{
@Override
public String apply(String input) { return String.format("%s!", input); }
}
如果用戶需要與上下文相關(guān)的信息,例如函數(shù)的名稱,那么用戶可以只實現(xiàn)PulsarFunction接口而不是Java的Function接口。下面給出一個相應(yīng)的示例:
public interface PulsarFunction {
O process(I input, Context context) throws Exception;
}Pulsar函數(shù)可以使用多種配置來進(jìn)行部署。下面,我們將展開詳細(xì)討論。
Pulsar函數(shù)部署方案選擇
Pulsar函數(shù)由稱為實例的執(zhí)行器運行。單個實例執(zhí)行函數(shù)的一個副本。Pulsar函數(shù)具有內(nèi)置的并行性,因為一個函數(shù)可以有許多實例,這些實例的數(shù)量可以在函數(shù)的配置中設(shè)置。
為了最大限度地提高部署靈活性,Pulsar函數(shù)提供了多種執(zhí)行環(huán)境來支持多種部署選項,并提供了大量運行時來執(zhí)行用不同編程語言編寫的函數(shù)。當(dāng)前支持以下執(zhí)行環(huán)境:
|
運行時 |
描述? |
|
進(jìn)程運行時 |
每個實例都作為一個進(jìn)程運行。 |
|
Kubernetes / Docker 運行時 |
每個實例都作為Docker容器運行 |
|
線程運行時 |
每個實例都作為線程運行,這種類型僅適用于Java實例,因為Pulsar Functions框架本身是用Java編寫的 |
每個執(zhí)行環(huán)境都會產(chǎn)生不同的成本,并提供不同的隔離保證。
運行Pulsar函數(shù)
運行Pulsar函數(shù)最簡單的方法是實例化一個運行時和一個函數(shù),并在本地運行它們(本地運行模式)。有一個助手命令行工具使這一點非常簡單。在本地運行模式下,該函數(shù)作為獨立運行時運行,可以由可用的任何進(jìn)程、Docker容器或線程控制機(jī)制進(jìn)行監(jiān)視和控制。
用戶可以手動在機(jī)器上生成這些運行時,或者使用復(fù)雜的調(diào)度程序(如Mesos/Kubernetes)將它們分布到集群中。以下是在“本地運行”模式下啟動Pulsar函數(shù)的命令示例:
$ bin/pulsar-admin functions localrun \
--inputs persistent://sample/standalone/ns1/test_src \
--output persistent://sample/standalone/ns1/test_result \
--jar examples/api-examples.jar \
--className org.apache.pulsar.functions.api.examples.ExclamationFunction
用戶還可以在Pulsar集群內(nèi)與代理一起運行函數(shù)。在這種模式下,用戶可以向正在運行的Pulsar集群“提交”其功能,Pulsar將負(fù)責(zé)在集群中分發(fā)這些功能,并監(jiān)視和執(zhí)行這些功能。
該模型允許開發(fā)人員專注于編寫他們的函數(shù),而不用擔(dān)心管理函數(shù)的生命周期。下面是提交要在Pulsar集群中運行的一個Pulsar函數(shù)的示例:
$ bin/pulsar-admin functions create \
--inputs persistent://sample/standalone/ns1/test_src \
--output persistent://sample/standalone/ns1/test_result \
--jar examples/api-examples.jar \
--className org.apache.pulsar.functions.api.examples.ExclamationFunction \
--name myFunction
另一種選擇是將函數(shù)的整個配置放置在一個YAML文件中,如下所示:
inputs: persistent://sample/standalone/ns1/test_src
output: persistent://sample/standalone/ns1/test_result
jar: examples/api-examples.jar
className: org.apache.pulsar.functions.api.examples.ExclamationFunction
name: myFunction
如果開發(fā)者選擇通過YAML方式配置一個函數(shù)的話,則可以使用更簡單的create命令:
className: org.apache.pulsar.functions.api.examples.ExclamationFunction
name: myFunction
如果開發(fā)者選擇通過YAML方式配置一個函數(shù)的話,則可以使用更簡單的create命令:
Pulsar函數(shù)提供以下功能,可針對不同的函數(shù)進(jìn)行專門的指定:
1.最多一次(最多一次)
2.至少一次(至少一次)
3.有效一次(有效一次)
其中,有效的一次(Effective once)處理是通過將至少一次(A這意味著,狀態(tài)更新可以發(fā)生兩次,但狀態(tài)更新只能應(yīng)用一次,而任何重復(fù)的狀態(tài)都會在服務(wù)器端被丟棄。
小結(jié)
通過本文的介紹,我希望能夠激起讀者對Pulsar函數(shù)的興趣。此外,本文還向讀者展示了Pulsar函數(shù)的擴(kuò)展功能:如何允許開發(fā)者將Pulsar用作處理數(shù)據(jù)流的統(tǒng)一系統(tǒng)。
當(dāng)然,Pulsar函數(shù)還蘊藏著更多的能力和可能性:讀者可以在Apache Pulsar網(wǎng)站上了解到更多有關(guān)Pulsar函數(shù)的信息。
譯者介紹
朱先忠,社區(qū)編輯,專家博客、講師,濰坊一所高校計算機(jī)教師,自由編程界老兵一枚。早期專注各種微軟技術(shù)(編著成 ASP.NET AJX、Cocos 2d-X相關(guān)三本技術(shù)圖書),近十多年投身于開源世界(熟悉流行全棧Web開發(fā)技術(shù)),了解基于OneNet/AliOS+Arduino/ESP32/樹莓派等物聯(lián)網(wǎng)開發(fā)技術(shù)與Scala+Hadoop+Spark+Flink等大數(shù)據(jù)開發(fā)技術(shù)。
網(wǎng)頁題目:什么是Pulsar函數(shù)流處理應(yīng)用?
瀏覽地址:http://fisionsoft.com.cn/article/cdhhijp.html


咨詢
建站咨詢
