系統設計: 處理服務讀取多個任務遇到的問題 (Go 語言)

system design 02

不同的服務都會有需要處理比較久的任務,這些任務是不能即時執行完成,才回應給前端,這樣使用者體驗會非常的差。將類型的任務存在資料庫或放在消息對列就是一種處理方式,接著啟動另一個服務來消化非即時性的任務,而常見的處理方式就是在服務內啟動多個 Worker Node 來平行消化任務 (如上圖)。

[Read More]

三款好用的繪圖工具來解決系統架構或流程圖

drwaio 01

不管是長官還是同事甚至下屬,在公司無時無刻都需要跨團隊進行溝通,當系統架構或流程越來越複雜的時候,如果沒有按照當下情況記錄下來,對於未來接手的同事,或者是自己都會不小心忘記,而在記憶最清楚的當下用文字或流程圖記錄下來,對團隊及自己是有相當大的幫助。而有沒有工具可以快速畫出系統架構或流程圖?我們可以分幾種情境來討論。

[Read More]

用 Google 團隊推出的 Wire 工具解決 Dependency Injection

proposal

不知道大家在用 Go 語言寫服務的時候,會不會遇到 Components 會有相互依賴的關係,A 物件依賴 B 物件,B 物件又依賴 C 物件,所以在初始化 A 物件前,就必須先將 B 跟 C 初始化完成,這就是錯綜復雜的關係。也許大家會想到另一個做法,就是把每個物件都宣告成全域變數,我個人不推薦這個使用方式,雖然很方便,但是就會讓整體架構變得很複雜。而本篇要介紹一個救星工具,就是 Google 團隊開發的 Wire 工具,官方部落格也可以參考看看。此工具就是為了解決底下兩個問題 (dependency injection)。

  1. Components 互相依賴錯綜復雜的關係
  2. 不要宣告全域變數
[Read More]

三種好用的 gRPC 測試工具

grpc flow proposal

最近在用 Go 語言實作微服務,溝通的接口採用 gRPC,除了可以透過 gRPC 支援的第三方語言來寫客戶端的測試之外,有沒有一些好用的工具來驗證檢查 gRPC 實現的接口。剛好今年看到 Postman 宣布開始支援 gRPC,相信大家對於 Postman 工具並不會太陌生,畢竟測試 Websocket 或 RESTful API 都是靠這工具呢。本篇除了介紹 Postman 之外,還有一套 CLI 工具 grpcurl 及一套 GUI 工具 grpcui 也是不錯用,後面這兩套都是由同一家公司 FullStory 開源出來的專案,底下就來一一介紹。

[Read More]

監控服務 Gatus 系統架構

gatus proposal

今年第一場公開的演講 2022 台灣雲端大會,台灣五月開始疫情變嚴重,故延遲了一次到七月才舉辦,這次帶給大家的是『自動化監控網站運行服務 – Gatus』,內容可以拆為兩個部分,第一部分是介紹為什麼要使用 Gatus,用來解決開發團隊哪些問題,我也整理了三大點為什麼我選擇 Gatus,另一部分就是本篇的主軸,Gatus 系統架構跟流程。

  1. 監控條件 (客製化回應)
  2. 開源專案 (Go 語言)
  3. 簡易頁面 (Status Page)

對於使用 Gatus 有興趣的朋友可以參考我之前寫的文章:『自動化監控網站運行服務 - Gatus』,本篇就不介紹怎麼使用 Gatus 了。

[Read More]

在 Go 語言測試使用 Setup 及 Teardown

logo

相信大家在寫測試時,都會需要啟動而外服務,像是 RedisPostgres 等,而開始測試前會需要初始化資料庫連線,或者是準備測試資料,測試結束後就關閉資料庫連線,並且移除不必要的測試資料或檔案。在 Go 語言內開發者不用去依賴第三方的套件,透過內建的 TestMain 就可以非常輕鬆完成此事情。底下看看如何操作及使用。

[Read More]

優化重構 Worker Pool 程式碼

logo

最近看到 Go 語言一段程式碼,認為有很大的優化空間,也將過程跟想法分享給大家。也許每個人優化的方向不同,各位讀者可以把程式碼整個看完後,先停住,不要繼續往下看,想看看是否有優化的空間。此程式碼本身沒有任何問題,執行過程不會出現任何錯誤。

先說明底下範例在做什麼,相信大家都有聽過在 Go 語言內要實現 Worker Pools 機制相當簡單,看到 ExecuteAll 函式就是讓開發者可以自訂同時間開多少個 Goroutine 來平行執行工作,第二個參數可以自訂義工作內容是什麼。

[Read More]

在 Go 語言內使用 bytes.Buffer 注意事項

logo

Go 語言中,如何高效的處理字串相加,由於字串 (string) 是不可變的,所以將很多字串拼接起來,會如同宣告新的變數來儲存。這邊就可以透過 strings.Builderbytes.Buffer 來解決字串相加效能問題。除了效能問題之外,還需要注意在 bytes.Buffer 處理 []bytestring 之間的轉換,底下拿實際專案上寫出來的錯誤給大家參考看看

[Read More]

用 10 分鐘了解 Go 語言如何從 Channel 讀取資料

logo

Go 語言強大的 goroutine 特性,讓各位開發者愛不釋手,而多個 goroutine 如何溝通呢?就是透過 Channel 來做到。本篇教大家從 Channel 讀取資料的兩種方式及使用時機,並實際用一個案例快速了解 Channel 實作上會遇到哪些問題?底下用兩個範例讓大家了解如何讀取 Channel 資料出來。

[Read More]

用 Go 語言實現 Pub-Sub 模式

logo

相信大家都知道發布 / 訂閱模式,開發者可以透過第三方開源工具像是 Redis, NSQNats 等來實現訂閱機制,本篇則是會教大家如何用 Go 語言寫出一個單機版本的 Pub/Sub 模式,在單一系統內非常輕量級,且不需要靠第三方服務就可以輕易實現。底下會直接用單一訂閱 Topic 機制來撰寫 Publisher 及 Subscriber。

[Read More]