[分享] 如何取消正在執行的工作任務 (用 Go 語言實作 MQ)

軟工

1731

文字教學: https://bit.ly/3jFMwvS
教學影片: https://bit.ly/3WI0Wdx

範例程式: https://bit.ly/3Z0U6Bt

系統架構圖: https://i.imgur.com/VZyfv0M.png


本篇來聊聊『如何取消正在執行的工作任務』,當系統內有需要處理比較久或較多資源的
任務,肯定會將這些任務丟到其他機器再執行,執行過程如果需要取消,會經過如上圖幾
個步驟。先假設中間的過程不透過 Message Queue 機制,而是兩個服務進行溝通透過
RESTful 或 gRPC 方式。

## 使用情境

可以看到步驟一是 worker 會先發請求到後端服務,詢問目前正在執行的任務是否取消,
這邊可以用一個長連接持續 30 秒或 1 分鐘才斷線。步驟二是 User 從 Web UI 端按下
取消的按鈕。步驟三是後端服務接受到取消任務的請求,就回覆 Worker 到請求執行取消
任務。

大家可以想看看此情境該如何設計流程,先不考慮多台後端服務的情境,也不考慮使用
Message Queue 的方式來實作。也許大家有想到一種方式,就是當使用者按下取消時 (到
步驟三),後端服務將此任務的狀態改成取消。而 Worker 每次來詢問狀態 (步驟一),後
端就再查詢一次就可以了 (步驟四),這方式也沒有不對,只是即時性效果比較差,如果
是每 30 秒輪詢一次,就有可能 30 秒後才能取消任務,輪詢時間設定很短,又會造成過
多不必要的連線請求。除了這種方式外,還有沒有其他方式可以不需要查詢資料庫就可以
即時讓 Worker 知道目前任務狀態。

目前先講單機版解法,非常適用於要將服務部署在不同團隊內。

## 心得

本篇最主要是要用 Go 語言的 Channel 特性來處理兩個服務之間的溝通機制,大家可能
想到的解法就是用 Message Queue 來處理,但是有時候把架構想的更簡單一點,用 Go
語言的特性來處理,那就減少一個服務的維運,未來要將此架構轉換到其他平台就會更簡
單,其他部門有需求會是將整套服務架設在不同團隊內,這時候架構越簡單,除錯時間會
越短。

--
AppleBoy Blog: http://blog.wu-boy.com

--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.110.136.13 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1672537150.A.DD7.html
loadingN1樓mq夠簡單了吧... 要轉換到其他地方也不難 01/01 10:12
ddoll2882樓火山表示___ 01/01 10:58
alan31003樓..哪個語言沒內建mq 01/01 12:01
LincolnBoy4樓樓上那篇怎麼刪文了 01/01 13:01
alan31005樓mq外部化可以讓上下游達到stateless 01/01 14:17
alan31006樓subscriber每個語言都有 不太會自己實作多少秒觀察一次 01/01 14:19
alan31007樓除非服務很簡單,不然用外部mq對維護營運上比較容易 01/01 14:24
TSW8樓感覺只是為了寫而寫.... 01/02 06:56
Murasaki01109樓語言dependent又不scalable,算什麼系統設計?隨便 01/02 09:48
Murasaki011010樓哪個mq維護成本也比維護這土炮架構好 01/02 09:48
lance7017611樓MQ 設計好多了吧 01/03 07:46
本人12樓用 MQ 處理長時間的任務,可能會遇到底下問題 01/04 11:50
本人13樓1. 如何取得目前任務的狀態? 01/04 11:51
本人14樓2. 如何設定任務超時機制? 01/04 11:51
本人15樓3. 如何跨服務取消任務? 01/04 11:52
本人16樓4. 當 Worker 失去連線或不正常關閉,該如何讓 Task 01/04 11:52
本人17樓可以重新執行? 01/04 11:52
本人18樓5. 當有多台 Server + 多台 Worker 時,該如何配送任 01/04 11:52
本人19樓務及取消任務? 01/04 11:53
alan310020樓..你沒用過mq吧 不然應該不會問4&5 01/04 22:12
alan310021樓別說task派送和取消了 現在還有跨服務交易但不綁連線 01/04 22:15
alan310022樓可以查saga pattern. 01/04 22:18
alan310023樓後面worker達到stateless很基本 就算土砲應該也不該擔心 01/04 22:30
alan310024樓失去連線或當掉或不正常關閉 就算你直接kill-9也可以 01/04 22:32
alan310025樓直接查async request reply 或直接查go原始碼 你會發現 01/04 23:14
alan310026樓裡面一定會有queue. 你只是享受別人封裝好的 01/04 23:15
peter9827樓原po需要好好了解系統設計 人家如果問你"如何取消正在執 01/04 23:31
peter9828樓行的工作任務" 你在面試中會被炮到你完全無法講答案 01/04 23:31
peter9829樓因為你回答的不是系統設計 01/04 23:31
peter9830樓*你在面試中"這樣答"會被炮到你完全無法講答案 01/04 23:32