Apache Pulsar 之 Go Function

作者 | 冉小龍

審校 | Anonymitaet

編輯 | Susan

閱讀本文需要約 8 分鐘。

image

- 導(dǎo)讀 -

在學(xué)習(xí)如何編寫熏迹、部署 Go Function 之前,先向大家介紹一下 Go Function 的實(shí)現(xiàn)思路。

一篇文章了解 Pulsar Functions 中我們提到窿侈,F(xiàn)unction 作為 Pulsar 的計算層,其實(shí)現(xiàn)思路主要有如下兩種:

  • SDK

  • Plugin

之前介紹的 Java FunctionPython Function 使用 Plugin 的形式實(shí)現(xiàn)秋茫,本篇介紹的 Go Function 卻使用 SDK 的形式提供給用戶使用史简。為什么我們不與 Java Function 和 Python Function 采用相同的形式卻要在 Go Function 中另辟蹊徑,以 SDK 的形式提供給用戶使用呢肛著?

Go Function 使用 SDK 的原因

1

Go 不支持動態(tài)反射圆兵。這是語言層面本身的問題,Go 是一門靜態(tài)類型的語言枢贿,雖然支持了反射的功能衙傀,但反射的支持相對較弱,不支持動態(tài)反射的功能萨咕。

這一點(diǎn)與 Java 和 Python 不同统抬,Python 是動態(tài)類型的語言,動態(tài)加載本身就是它的強(qiáng)項所在危队。Java 雖然是靜態(tài)類型的語言聪建,但支持 ClassLoader 可以實(shí)現(xiàn)類似動態(tài)反射的功能。

所以在 Go 中我們沒辦法直接將用戶的代碼邏輯動態(tài)加載到 Pulsar Functions 中來執(zhí)行茫陆。

2

Go Plugin 不成熟金麸。Go 1.8 官方實(shí)現(xiàn)了 Go Plugin,支持動態(tài)加載的特性簿盅,但是并不成熟挥下,在調(diào)研過程中發(fā)現(xiàn)的主要問題如下:

  • 如果注入了一些非法模塊,會帶來一定的安全隱患桨醋,如何防范它們?

  • 給系統(tǒng)帶來一些不穩(wěn)定因素棚瘟。如果模塊出現(xiàn)問題,則會導(dǎo)致服務(wù)崩潰喜最。

  • 它給版本管理帶來了一定的困難偎蘸,特別是在微服務(wù)場景下,相同的服務(wù)瞬内,加載了不同的插件迷雪,如何做版本的管理?

  • 社區(qū)相對不成熟虫蝶。

基于以上考量章咧,我們使用了 SDK 的形式來做 Go Function 的實(shí)現(xiàn)。

編寫 Go Function

Go Function 使用 SDK 實(shí)現(xiàn)能真,將 Function 的接口以 SDK 的形式對外暴露給用戶赁严,在使用 Go Function 之前需要 import "github.com/apache/pulsar/pulsar-function-go/pf"调限,使用方式具體如下:

import (
"context"
"fmt"

"github.com/apache/pulsar/pulsar-function-go/pf"

)

func HandleRequest(ctx context.Context, input []byte) error {
fmt.Println(string(input) + "!")
return nil
}

func main() {
pf.Start(HandleRequest)
}

在上述示例代碼中,將輸入的 input 加 ! 后打印误澳,第一個參數(shù)為一個 context 對象,當(dāng)用戶編寫的 Function 需要與 Go Function 進(jìn)行交互時秦躯,可以加入該參數(shù)忆谓,使用示例如下:

if fc, ok := pf.FromContext(ctx); ok {
fmt.Printf("function ID is:%s, ", fc.GetFuncID())
fmt.Printf("function version is:%s\n", fc.GetFuncVersion())
}

在 main() 中,用戶只需要將編寫的 Function name 注冊到 Start() 中踱承,需要注意的是倡缠,Start() 中只能接收一個函數(shù)的名字。Go Function 會根據(jù)接收到的 Function name 利用 Go 的反射來驗(yàn)證用戶實(shí)現(xiàn)的參數(shù)列表和返回值列表是否正確茎活。

為了方便驗(yàn)證昙沦,需要規(guī)定用戶輸入的參數(shù)列表與返回值列表具體為什么,Go Function 目前支持如下形式的函數(shù)樣例:

func ()
func () error
func (input) error
func () (output, error)
func (input) (output, error)
func (context.Context) error
func (context.Context, input) error
func (context.Context) (output, error)
func (context.Context, input) (output, error)

在一切準(zhǔn)備就緒之后载荔,Go Function 會啟動 channel 來源源不斷地接收從 inputs topic 中傳入的數(shù)據(jù)盾饮。需要說明的是,用戶無需關(guān)心該 channel 關(guān)閉的時機(jī)懒熙,因?yàn)樵?Function 的使用場景下丘损,一旦啟動就會源源不斷的來處理輸入的數(shù)據(jù),用戶可以使用 Ctrl+C 來終止整個程序的運(yùn)行工扎,或者可以通過參數(shù) killAfterIdleMs 來配置該 Function 運(yùn)行的時長徘钥,單位為毫秒。

部署 Go Function

Go Function 的實(shí)現(xiàn)依賴于 pulsar-client-go肢娘,在運(yùn)行 Go Function 之前呈础,需要保證 pulsar-client-go 正確安裝,具體安裝參考 pulsar-client-go 安裝橱健。

pulsar-client-go:

https://pulsar.apache.org/docs/en/client-libraries-go/

Go Function 的實(shí)現(xiàn)形式雖然同 Java FunctionPython Function 不同而钞,但是為了降低用戶的部署成本,對外暴露給用戶的部署方式是相同的拘荡,具體操作如下:

  1. 啟動 Pulsar笨忌。

  2. 編譯 Go Function。

$ go build [your function file name].go

3\. 啟動 Go Function俱病。

./bin/pulsar-admin functions localrun/create
--go [your go function path]
--inputs [input topics]
--output [output topic]
--tenant [default:public]
--namespace [default:default]
--name [custom unique go function name]

注意:

  • 與 Java Function 和 Python Function 不同的是官疲,在 Go Function 中,用戶無需指定 classname亮隙。

  • 在 Java Function 中途凫,--jar 上傳的是打包好的 jar 文件;在 Python Function 中 --py 所上傳的是 python 文件溢吻;無論哪種形式维费,上傳的都屬于 user code果元。而 Go Function 中 --go 所上傳的是一份編譯好的可執(zhí)行文件,其中包含了 user code 和 Function 本身的代碼犀盟。

Go Function 目前不支持的功能如下:

  • Schema而晒,目前 input 和 output 只允許為 []byte

  • Metrics

  • Secrets

  • Authentication & Authorization

更多關(guān)于 Pulsar 的技術(shù)干貨和產(chǎn)品動態(tài),請關(guān)注 StreamNative 微信公眾號阅畴。

下一場 Pulsar meetup 于 6/29 在深圳舉辦倡怎,歡迎來現(xiàn)場了解 Pulsar。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贱枣,一起剝皮案震驚了整個濱河市监署,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纽哥,老刑警劉巖钠乏,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異春塌,居然都是意外死亡晓避,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門只壳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來够滑,“玉大人,你說我怎么就攤上這事吕世≌么ィ” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵命辖,是天一觀的道長况毅。 經(jīng)常有香客問我,道長尔艇,這世上最難降的妖魔是什么尔许? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮终娃,結(jié)果婚禮上味廊,老公的妹妹穿的比我還像新娘。我一直安慰自己棠耕,他們只是感情好余佛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著窍荧,像睡著了一般辉巡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蕊退,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天郊楣,我揣著相機(jī)與錄音憔恳,去河邊找鬼。 笑死净蚤,一個胖子當(dāng)著我的面吹牛钥组,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播今瀑,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼程梦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了放椰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤愉粤,失蹤者是張志新(化名)和其女友劉穎砾医,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衣厘,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡如蚜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了影暴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片错邦。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖型宙,靈堂內(nèi)的尸體忽然破棺而出撬呢,到底是詐尸還是另有隱情,我是刑警寧澤妆兑,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布魂拦,位于F島的核電站,受9級特大地震影響搁嗓,放射性物質(zhì)發(fā)生泄漏芯勘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一腺逛、第九天 我趴在偏房一處隱蔽的房頂上張望荷愕。 院中可真熱鬧,春花似錦棍矛、人聲如沸安疗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茂契。三九已至,卻和暖如春慨绳,著一層夾襖步出監(jiān)牢的瞬間掉冶,已是汗流浹背真竖。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厌小,地道東北人恢共。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像璧亚,于是被迫代替她去往敵國和親讨韭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容