使用 GraphQL Gateway 串接多個 Data Schema

infra

不久之前寫過一篇『從 graphql-go 轉換到 gqlgen』,目前團隊舊有的專案還是繼續用 graphql-go 來撰寫,不過之後需求量越來越大,維護 graphql-go 就越來越困難,故有在想怎麼把 gqlgen 跟 graphql-go 相容在一起,那就是把這兩個套件想成不同的服務,再透過 Gateway 方式完成 single data graph。至於怎麼選擇 GraphQL Gateway 套件,最容易的方式就是使用 @apollo/gateway,但是由於個人比較偏好 Go 語言的解決方案,就稍微找看看有無人用 Go 實現了 Gateway,後來找到 nautilus/gateway,官方有提供文件以及教學 Blog 可以供開發者參考。底下會教大家使用 nautilus/gateway 將兩個不同的服務串接在一起。

[Read More]

用 Go 語言撰寫簡單的 Command Line 工具

golang logo

之前介紹了一個開源工具『用 Docker 每天自動化備份 MySQL, Postgres 或 MongoDB 並上傳到 AWS S3』,讓開發者可以快速透過 Docker 方式來備份資料庫,而本篇要介紹我如何用 Go 語言來撰寫 CLI 並且整合 Docker 來實現備份。此工具都是透過各大資料庫官方提供的 CLI 指令 (pg_dump, mysqldump … 等),故大家不用猜想是什麼神奇的技巧。底下來依序介紹整個目錄結構,及我如何實現。

[Read More]

Go 1.16 推出 Embedding Files

golang logo

Go 語言官方維護團隊 rsc 之前在 GitHub Issue 上面提出要在 go command line 直接支援 Embedding Files,沒想到過沒幾個月,就直接實現出來了,並且預計在 2021 的 go 1.16 版本直接支援 embed 套件。有了這個功能,就可以將靜態檔案或專案設定檔直接包起來,這樣部署就更方便了。底下來看看官方怎麼使用。

[Read More]

善用 Go 語言效能測試工具來提升執行效率

golang logo

在 AI 訓練模型前,都需要經過大量的資料處理,而資料處理的速度在整個流程內扮演很重要的角色,寫出高效能的 Parser 能降低整體處理時間,那如何評估程式效能如何,以及如何快速找到效能瓶頸?本議程會帶大家了解 Go 語言內建的效能測試工具,透過 Benchmark 來找出程式效能瓶頸的地方,快速改善及優化,讓整個系統流程更順暢。也會順道分享 Go 在字串處理優化的一些小技巧。聽過此議程相信您對 Go 語言會有更深入的了解,如果你想寫出有效率的程式碼,本議程一定不能錯過。

[Read More]

Go 語言 Select Multiple Channel 注意事項

golang logo

相信大家都知道 Select 可以用來處理多個 Channel,但是大家有沒有想過一個情境,如果是 for 搭配 select 時,肯定會用一個 Timer 或 context 來處理 Timeout 或手動 Cancel,假設如果跟其他 Channel 同時到達時,官方說法是 Select 會隨機選擇一個狀況來執行,如果並非選到我們所要的 case 那就會造成情境或流程上的錯誤,而本影片就是講解該如何解決此問題,請大家務必詳細了解業務的需求,來決定程式碼架構該如何寫。

[Read More]

用 Go 語言實戰 Limit Concurrency 方法

golang logo

最近看到一篇文章討論的非常熱烈,就是『concurrency is still not easy』這篇文章甚至上了 Hack News,大家有興趣可以點進去看看,而本篇會用一個實際案例介紹為什麼作者會說寫 Concurrency 不是這麼容易。大家都知道在 Go 語言內,要寫 Concurrency 只要透過一個關鍵字 go 就可以輕易寫出,而多個 Goroutine 要溝通就是需要透過 Channel 方式,而網路上有一堆 Concurrency Pattern 提供給各位開發者,但是官方 Go 的標準庫內並沒有包含這些 Pattern,所以實作之後,說實在很難看出問題。文章內提到 gops 實作 Limit Concurrency 遇到系統整個 hang 住的問題?什麼是 Limit Concurrency,就是當系統有多個工作需要同時執行,但是需要限制 Concurrency 數量,避免整個資源都被吃光。底下來介紹文章內遇到的問題。

[Read More]

在 Go 語言內管理 Concurrency 的三種方式

golang logo

相信大家踏入 Go 語言的世界,肯定是被強大的 Concurrency 所吸引,Go 語言用最簡單的關鍵字 go 就可以將任務丟到背景處理,但是怎麼有效率的控制 Concurrency,這是入門 Go 語言必學的項目,本篇會介紹三種方式來帶大家認識 Concurrency,而這三種方式分別對應到三個不同的名詞: WaitGroup, Channel, 及 Context,底下用簡單的範例帶大家了解。

[Read More]

Go 1.15 新增 Module cache 環境變數

golang logo

相信各位開發者在寫 Go 語言專案,現在肯定都是使用 Go module 了,而 Go Module 檔案預設寫在 /go/pkg/mod 目錄內,要串 CI/CD 流程時,由於不在專案路徑底下,所以每一個 Container 無法共用 /go/pkg/mod 路徑,造成重複下載第三方套件,其實跨容器的解決方式可以透過 DroneTemporary Volumes 方式解決,但是最終希望跑完編譯流程時,可以將最後的 mod 目錄打包留到下次的 CI/CD 部署流程使用,這時候如果可以改變 /go/pkg/mod 路徑,就可以動態調整目錄結構了。底下是針對 Drone 這套部署工具進行解說。

[Read More]

Go 語言用 pprof 找出程式碼效能瓶頸

golang logo

Go 語言除了內建強大的測試工具 (go test) 之外,也提供了效能評估的工具 (go tool pprof),整個生態鏈非常完整,這也是我推薦大家使用 Go 語言的最大原因,這篇會介紹如何使用 pprof 來找出效能瓶頸的地方。假設開發者在寫任何邏輯功能時,發現跑出來的速度不是想像的這麼快,或者是在串接服務流程時,整個回覆時間特別久,這時候可以透過 benchmark 先找出原因。

1
go test -bench=. -benchtime=3s ./lexer/
[Read More]