極速精簡 Go 版 Logstash
前言
今天來介紹 go-zero
生態的另一個元件 go-stash
。這是一個 logstash
的 Go 語言替代版,我們用 go-stash
相比原先的 logstash
節省了2/3的伺服器資源。如果你在用 logstash
,不妨試試,也可以看看基於 go-zero
實現這樣的工具是多麼的容易,這個工具作者僅用了兩天時間。
整體架構
先從它的配置中,我們來看看設計架構。
Clusters:
- Input:
Kafka:
# Kafka 配置 --> 聯動 go-queue
Filters:
# filter action
- Action: drop
- Action: remove_field
- Action: transfer
Output:
ElasticSearch:
# es 配置 {host, index}
看配置名:kafka
是資料輸出端,es
是資料輸入端,filter
抽象了資料處理過程。
對,整個 go-stash
就是如 config 配置中顯示的,所見即所得。
啟動
從 stash.go
的啟動流程大致分為幾個部分。因為可以配置多個 cluster
,那從一個 cluster
分析:
- 建立與
es
的連線【傳入es
配置】 - 構建
filter processors
【es
前置處理器,做資料過濾以及處理,可以設定多個】 - 完善對
es
中 索引配置,啟動handle
,同時將filter
加入handle【處理輸入輸出】 - 連線下游的
kafka
,將上面建立的handle
傳入,完成kafka
和es
之間的資料消費和資料寫入
MessageHandler
在上面架構圖中,中間的 filter
只是從 config 中看到,其實更詳細是 MessageHandler
的一部分,做資料過濾和轉換,下面來說說這塊。
以下程式碼:
type MessageHandler struct {
writer *es.Writer
indexer *es.Index
filters []filter.FilterFunc
}
這個就對應上面說的,filter
只是其中一部分,在結構上 MessageHandler
是對接下游 es
,但是沒有看到對 kafka
的操作。
別急,從介面設計上 MessageHandler
實現了 go-queue
中 ConsumeHandler
介面。
這裡,上下游就串聯了:
-
MessageHandler
接管了es
的操作,負責資料處理到資料寫入 - 對上實現了
kafka
的Consume
操作。這樣在消費過程中執行handler
的操作,從而寫入es
實際上,Consume()
也是這麼處理的:
func (mh *MessageHandler) Consume(_, val string) error {
var m map[string]interface{}
// 反序列化從 kafka 中的訊息
if err := jsoniter.Unmarshal([]byte(val), &m); err != nil {
return err
}
// es 寫入index配置
index := mh.indexer.GetIndex(m)
// filter 鏈式處理【因為沒有泛型,整個處理都是 `map進map出`】
for _, proc := range mh.filters {
if m = proc(m); m == nil {
return nil
}
}
bs, err := jsoniter.Marshal(m)
if err != nil {
return err
}
// es 寫入
return mh.writer.Write(index, string(bs))
}
資料流
說完了資料處理,以及上下游的連線點。但是資料要從 kafka -> es
,資料流出這個動作從 kafka
角度看,應該是由開發者主動 pull data from kafka
。
那麼資料流是怎麼動起來?我們回到主程式
其實 整個流程中,其實就是一個組合模式:
func main() {
// 解析命令列引數,啟動優雅退出
...
// service 組合模式
group := service.NewServiceGroup()
defer group.Stop()
for _, processor := range c.Clusters {
// 連線es
...
// filter processors 構建
...
// 準備es的寫入操作 {寫入的index, 寫入器writer}
handle := handler.NewHandler(writer, indexer)
handle.AddFilters(filters...)
handle.AddFilters(filter.AddUriFieldFilter("url", "uri"))
// 按照配置啟動kafka,並將消費操作傳入,同時加入組合器
for _, k := range toKqConf(processor.Input.Kafka) {
group.Add(kq.MustNewQueue(k, handle))
}
}
// 啟動這個組合器
group.Start()
}
整個資料流,就和這個 group
組合器有關了。
group.Start()
|- group.doStart()
|- [service.Start() for service in group.services]
那麼說明加入 group
的 service
都是實現 Start()
。也就是說 kafka
端的啟動邏輯在 Start()
:
func (q *kafkaQueue) Start() {
q.startConsumers()
q.startProducers()
q.producerRoutines.Wait()
close(q.channel)
q.consumerRoutines.Wait()
}
- 啟動
kafka
消費程式 - 啟動
kafka
消費拉取端【可能會被名字迷惑,實際上是從kafka
拉取訊息到q.channel
】 - 消費程式終止,收尾工作
而我們傳入 kafka
中的 handler
,上文說過其實是 Consume
,而這個方法就是在 q.startConsumers()
中執行的:
q.startConsumers()
|- [q.consumeOne(key, value) for msg in q.channel]
|- q.handler.Consume(key, value)
這樣整個資料流就徹底串起來了:
總結
作為 go-stash
第一篇文章,本篇從架構和設計上整體介紹 go-stash
,有關效能和為什麼我們要開發一個這樣的元件,我們下篇文章逐漸揭曉。
關於 go-zero
更多的設計和實現文章,可以持續關注我們。
歡迎使用 go-zero 並 star 支援我們!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/818/viewspace-2807299/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 函式極限與連續精簡版函式
- 迅雷精簡版 for Mac!附精簡教程!Mac
- Go 語言極速入門4 - 物件導向Go物件
- 極其精簡的PHP框架WJWPHP框架
- 極通首次為中小企業量身定製EWEBS極速版Web
- 精簡版 koa 簡單實現
- Java面試整理(精簡版)Java面試
- 悅動圈極速版 APP體驗報告APP
- Virtual Dom && Diff原理,極簡版
- 精簡版的Rails框架->Rails::APIAI框架API
- Mybatis極速入門MyBatis
- CMake極速入門
- win10 64位開啟迅雷極速版閃退怎麼辦_win10用迅雷極速版經常閃退如何處理Win10
- 內網穿透教程,簡單,便捷,極速穿透內網埠內網穿透
- 以太坊簡介(2019 精校精注版)
- Google 推出 Files Go 中國版,命名“檔案極客”Go
- logstash簡介及基本操作
- js 陣列所有的方法精簡版JS陣列
- 【Docker】Linux安裝Docker(極簡版)DockerLinux
- openGauss2.0.0極簡版安裝
- 【Vue 極速指南】Vuex 篇Vue
- 打造極速 Windows XP(轉)Windows
- Android逆向之旅---手遊「狂野飆車極速版」內購破解教程Android
- 今日頭條極速版和今日頭條有什麼區別?
- 極速指南:在 SpringBoot 中快速整合騰訊雲簡訊功能Spring Boot
- swift4.0語法雜記(精簡版)Swift
- Flink安裝極簡教程-單機版
- 賽車競速遊戲:極限競速地平線2Horizon Chase 2中文原生版遊戲
- 將 LLMs 精調至 1.58 位元: 使極端量化變簡單
- Gin框架系列01:極速上手框架
- 極速體驗docker容器健康Docker
- ES6極速入門
- 極速體驗SpringCloud GatewaySpringGCCloudGateway
- 「極速上手TypeScript」TypeScript之PromiseTypeScriptPromise
- JavaScript 裝飾器極速指南JavaScript
- Dagger 2 極速入門
- Go 之基礎速學 (十一) golang 裡簡單工廠模式Golang模式
- iOS10開發者預覽版極速上手體驗影片!搶先嚐鮮iOS