用 Go 語言建立 Web 及 Worker 服務實現取消任務 (二)
Posted on January 2, 2023
| 3 minutes
| 556 words
| appleboy

上一篇『系統設計: 如何取消正在執行的工作任務 (一)』教大家如何用 Go 語言實現 canceler
package 來紀錄及取消正在執行的任務。而本篇來實現上圖的 HTTP Server
及 Worker
程式碼,底下直接用 Gin 框架來快速實現 HTTP 兩個 Handle,分別是 Cancel Task
及 Watch Task
(如下圖標示的 1 跟 2)。

其中上圖綠色框框 1
是用來接收使用者想要取消的任務,而 2
是用來讓 worker 進行長連接,根據不同的情境可以設定不同的等待時間。大家可能會問,為什麼不讓 Server 主動通知 Worker 就可以了,先解釋這點,這邊我們可能要先假設 Worker 存在的環境是封閉的,不能任意架設服務,故需要主動向 HTTP Server 進行詢問。其中 HTTP Server 跟 Worker 中間可以透過 gRPC 或 RESTful 進行資料交換,本篇先以 RESTful 進行說明。
[Read More]用 Go 語言實作如何取消正在執行的工作任務 (一)
Posted on December 23, 2022
| 4 minutes
| 790 words
| appleboy

本篇來聊聊『如何取消正在執行的工作任務』,當系統內有需要處理比較久或較多資源的任務,肯定會將這些任務丟到其他機器再執行,執行過程如果需要取消,會經過如上圖幾個步驟。先假設中間的過程不透過 Message Queue 機制,而是兩個服務進行溝通透過 RESTful 或 gRPC 方式。
[Read More]系統設計: 處理服務讀取多個任務遇到的問題 (Go 語言)
Posted on November 13, 2022
| 3 minutes
| 517 words
| appleboy

不同的服務都會有需要處理比較久的任務,這些任務是不能即時執行完成,才回應給前端,這樣使用者體驗會非常的差。將類型的任務存在資料庫或放在消息對列就是一種處理方式,接著啟動另一個服務來消化非即時性的任務,而常見的處理方式就是在服務內啟動多個 Worker Node 來平行消化任務 (如上圖)。
[Read More]三款好用的繪圖工具來解決系統架構或流程圖
Posted on September 17, 2022
| 2 minutes
| 278 words
| appleboy

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

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

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

今年第一場公開的演講 2022 台灣雲端大會,台灣五月開始疫情變嚴重,故延遲了一次到七月才舉辦,這次帶給大家的是『自動化監控網站運行服務 – Gatus』,內容可以拆為兩個部分,第一部分是介紹為什麼要使用 Gatus,用來解決開發團隊哪些問題,我也整理了三大點為什麼我選擇 Gatus,另一部分就是本篇的主軸,Gatus 系統架構跟流程。
- 監控條件 (客製化回應)
- 開源專案 (Go 語言)
- 簡易頁面 (Status Page)
對於使用 Gatus 有興趣的朋友可以參考我之前寫的文章:『自動化監控網站運行服務 - Gatus』,本篇就不介紹怎麼使用 Gatus 了。
[Read More]在 Go 語言測試使用 Setup 及 Teardown
Posted on July 17, 2022
| 4 minutes
| 849 words
| Appleboy

相信大家在寫測試時,都會需要啟動而外服務,像是 Redis 或 Postgres 等,而開始測試前會需要初始化資料庫連線,或者是準備測試資料,測試結束後就關閉資料庫連線,並且移除不必要的測試資料或檔案。在 Go 語言內開發者不用去依賴第三方的套件,透過內建的 TestMain
就可以非常輕鬆完成此事情。底下看看如何操作及使用。
[Read More]優化重構 Worker Pool 程式碼
Posted on June 7, 2022
| 4 minutes
| 640 words
| Appleboy

最近看到 Go 語言一段程式碼,認為有很大的優化空間,也將過程跟想法分享給大家。也許每個人優化的方向不同,各位讀者可以把程式碼整個看完後,先停住,不要繼續往下看,想看看是否有優化的空間。此程式碼本身沒有任何問題,執行過程不會出現任何錯誤。
先說明底下範例在做什麼,相信大家都有聽過在 Go 語言內要實現 Worker Pools 機制相當簡單,看到 ExecuteAll
函式就是讓開發者可以自訂同時間開多少個 Goroutine 來平行執行工作,第二個參數可以自訂義工作內容是什麼。
[Read More]在 Go 語言內使用 bytes.Buffer 注意事項
Posted on June 7, 2022
| 3 minutes
| 455 words
| Appleboy

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