函数组合的 N 种模式
隨著以函數(shù)即服務(wù)(Function as a Service)為代表的無(wú)服務(wù)器計(jì)算(Serverless)的廣泛使用,很多用戶(hù)遇到了涉及多個(gè)函數(shù)的場(chǎng)景,需要組合多個(gè)函數(shù)來(lái)共同完成一個(gè)業(yè)務(wù)目標(biāo),這正是微服務(wù)“分而治之,合而用之”的精髓所在。本文以阿里云函數(shù)計(jì)算為例,試圖全面介紹函數(shù)組合的常見(jiàn)模式和使用場(chǎng)景,希望有助于選擇合適的解決方案。
雖然本文主要介紹的是函數(shù)組合,但是基本思想也可用于服務(wù)組合。
函數(shù)同步調(diào)用函數(shù)
在這種模式里,函數(shù)直接調(diào)用 InvokeFunction 同步 API 執(zhí)行一個(gè)或者多個(gè)函數(shù),等待被調(diào)用函數(shù)返回結(jié)果,然后繼續(xù)執(zhí)行。這是一個(gè)有些爭(zhēng)議的模式,不使用同步調(diào)用通常有以下原因:
上面的理由是在有些場(chǎng)景下成立的,但是微服務(wù)最經(jīng)典最常見(jiàn)的組合方式就是同步調(diào)用,函數(shù)作為微服務(wù)的一種實(shí)現(xiàn)方式,這種同步調(diào)用的需求是不可回避的,在有些場(chǎng)景下采用同步調(diào)用模式是值得考慮的,這些場(chǎng)景包括:
在這種模式里,調(diào)用者通常不需要做復(fù)雜的計(jì)算,主要時(shí)間花在調(diào)用函數(shù)和等待返回上,因此調(diào)用者函數(shù)可以設(shè)置較小的內(nèi)存,以減少費(fèi)用;調(diào)用者還可以根據(jù)業(yè)務(wù)需求緩存調(diào)用結(jié)果,減少對(duì)其它函數(shù)的調(diào)用,從而節(jié)約費(fèi)用和增強(qiáng)容錯(cuò)性。
函數(shù)通過(guò) API 網(wǎng)關(guān)調(diào)用函數(shù)
與函數(shù)直接調(diào)用函數(shù)不同,這里被調(diào)用函數(shù)在 API 網(wǎng)關(guān)后面,使它看起來(lái)更像一個(gè)微服務(wù)。這種模式的限制和使用場(chǎng)景跟上面的直接調(diào)用模式類(lèi)似,不同之處是 API 網(wǎng)關(guān)提供了一些額外的能力,比如認(rèn)證和限流等。如果被調(diào)用者要根據(jù)某些業(yè)務(wù)信息對(duì)請(qǐng)求做處理,則使用 API 網(wǎng)關(guān)是一個(gè)好的選擇。當(dāng)然,使用 API 網(wǎng)關(guān)也帶來(lái)了額外的延遲和費(fèi)用,如果不需要使用 API 網(wǎng)關(guān)提供的能力,則讓函數(shù)直接調(diào)用函數(shù)是一個(gè)更好的選擇。
函數(shù)異步調(diào)用函數(shù)
在這種模式里,函數(shù)執(zhí)行完自身業(yè)務(wù)邏輯后,調(diào)用 InvokeFunction 異步 API 通知其它函數(shù)執(zhí)行并退出,它不關(guān)心被調(diào)用函數(shù)是否執(zhí)行完成。函數(shù)計(jì)算的 InvokeFunction 異步 API 是通過(guò)隊(duì)列實(shí)現(xiàn)的,異步請(qǐng)求首先被寫(xiě)入隊(duì)列,然后有一個(gè)組件從隊(duì)列里消費(fèi)請(qǐng)求,執(zhí)行相應(yīng)函數(shù)。這種模式的優(yōu)勢(shì)和使用場(chǎng)景有:
這種模式有如下局限性:
基于消息主題的函數(shù)調(diào)用
與上面的模式需要指定被調(diào)用函數(shù)不同,基于事件觸發(fā)模式讓調(diào)用者只需要發(fā)布消息,不關(guān)心誰(shuí)去消費(fèi)消息。在消息服務(wù)(MNS)中,主題是發(fā)布消息的目的地,發(fā)布者可以通過(guò) PublishMessage API 向主題發(fā)布消息, 主題的訂閱者會(huì)接收到發(fā)布到主題上的消息,MNS 與函數(shù)計(jì)算服務(wù)的集成讓函數(shù)可以直接作為訂閱者,簡(jiǎn)化了消息處理應(yīng)用的開(kāi)發(fā)和運(yùn)維代價(jià)。
和上面的異步調(diào)用模式相比,基于消息主題的調(diào)用模式有以下優(yōu)勢(shì):
這種模式的局限性跟異步調(diào)用函數(shù)類(lèi)似:
基于對(duì)象存儲(chǔ)服務(wù)的函數(shù)調(diào)用
函數(shù)計(jì)算服務(wù)除了集成了消息主題以外,還集成了對(duì)象存儲(chǔ)服務(wù) (OSS),表格存儲(chǔ)等其它事件源,這些事件源服務(wù)同樣可以作為連接函數(shù)的渠道。比如,一個(gè)非函數(shù)應(yīng)用對(duì) OSS 對(duì)象操作(創(chuàng)建,刪除等)后,通常需要其它渠道(比如消息服務(wù))通知其它應(yīng)用做后續(xù)處理,而由于 OSS 和函數(shù)計(jì)算的集成,只需簡(jiǎn)單配置,這些事件就可以直接傳遞給自定義函數(shù),而不需要額外渠道再傳遞信息,簡(jiǎn)化了數(shù)據(jù)處理流水線(xiàn)的開(kāi)發(fā)和運(yùn)維代價(jià)。
基于日志庫(kù)的函數(shù)調(diào)用
日志服務(wù)的日志庫(kù)是一個(gè)流(Stream)存儲(chǔ),生產(chǎn)者寫(xiě)入數(shù)據(jù)到日志庫(kù),消費(fèi)者讀出數(shù)據(jù)并處理。日志服務(wù)和函數(shù)計(jì)算的集成,使得消費(fèi)者可以是函數(shù),從而實(shí)現(xiàn)了通過(guò)流存儲(chǔ)來(lái)協(xié)調(diào)函數(shù)調(diào)用。上面所有模式都是調(diào)用者顯式或者隱式的觸發(fā)一個(gè)或多個(gè)被調(diào)用函數(shù)執(zhí)行,而這里生產(chǎn)者函數(shù)寫(xiě)入的數(shù)據(jù)不一定會(huì)立刻被消費(fèi)者函數(shù)處理,日志服務(wù)會(huì)根據(jù)用戶(hù)配置將多個(gè)數(shù)據(jù)批量推送給消費(fèi)者函數(shù)。
這種模式有以下優(yōu)勢(shì):
基于函數(shù)工作流的函數(shù)組合
函數(shù)工作流(Function Flow,簡(jiǎn)稱(chēng) FnF)是一個(gè)用來(lái)協(xié)調(diào)多個(gè)分布式任務(wù)執(zhí)行的全托管 Serverless 云服務(wù),簡(jiǎn)化了開(kāi)發(fā)和運(yùn)行業(yè)務(wù)流程所需要的任務(wù)協(xié)調(diào)、狀態(tài)管理以及錯(cuò)誤處理等繁瑣工作,讓用戶(hù)更好的專(zhuān)注業(yè)務(wù)邏輯開(kāi)發(fā)??梢哉f(shuō)函數(shù)工作流是轉(zhuǎn)為函數(shù)組合而生,有效的解決了上面幾種異步組合模式的局限性。
上面的所有模式都是通過(guò)點(diǎn)對(duì)點(diǎn)的方式來(lái)組合函數(shù),而函數(shù)工作流是一個(gè)集中的協(xié)調(diào)者,函數(shù)之前不再直接或者間接通信,所有的觸發(fā)都是由函數(shù)工作流發(fā)起,不同函數(shù)的輸入和輸出是通過(guò)函數(shù)工作流來(lái)傳遞。因此,這種方式下的函數(shù)代碼全是業(yè)務(wù)邏輯相關(guān),沒(méi)有上面模式里的發(fā)送主題消息,或者調(diào)用其它函數(shù)的邏輯,實(shí)現(xiàn)更加清晰。
函數(shù)工作流有以下優(yōu)勢(shì):
函數(shù)工作流目前還不支持同步調(diào)用方式,如果您有同步調(diào)用需求,歡迎聯(lián)系我們(見(jiàn)文章最后釘釘客戶(hù)群)。
總結(jié)
總的來(lái)說(shuō),上面的組合模式可以分為同步和異步兩種,在場(chǎng)景適合的情況下優(yōu)先選擇異步模式,享受異步模式帶來(lái)的松耦合,高容錯(cuò)等特性,否則使用同步模式。在異步模式中,如果需要編寫(xiě)復(fù)雜的組合邏輯,支持可靠的重試,把控整個(gè)流程,則推薦使用函數(shù)工作流,否則使用消息主題或者其它事件源服務(wù)來(lái)組合函數(shù)。
上面的模式也不是割裂的,它們?cè)谟行﹫?chǎng)景下可以搭配使用,比如有時(shí)候基于對(duì)象存儲(chǔ)服務(wù)的調(diào)用需要觸發(fā)多個(gè)函數(shù),這就可以結(jié)合使用 OSS 的事件觸發(fā)和函數(shù)工作流;又比如函數(shù)工作流通過(guò)消息隊(duì)列將任務(wù)發(fā)送給更廣泛的消費(fèi)者,觸達(dá)函數(shù)計(jì)算無(wú)法觸達(dá)的地方。
最后,歡迎加入函數(shù)工作流和函數(shù)計(jì)算客戶(hù)群。
“阿里巴巴云原生關(guān)注微服務(wù)、Serverless、容器、Service Mesh 等技術(shù)領(lǐng)域、聚焦云原生流行技術(shù)趨勢(shì)、云原生大規(guī)模的落地實(shí)踐,做最懂云原生開(kāi)發(fā)者的技術(shù)圈?!?/p>
總結(jié)
以上是生活随笔為你收集整理的函数组合的 N 种模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2020 云原生技术 7 大领域趋势全预
- 下一篇: 读懂这一篇,集群节点不下线