[分享] 如何取消正在执行的工作任务 (用 Go 语言实作 MQ)

楼主: appleboy46 (小恶魔)   2023-01-01 09:39:03
文字教学: 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
语言的特性来处理,那就减少一个服务的维运,未来要将此架构转换到其他平台就会更简
单,其他部门有需求会是将整套服务架设在不同团队内,这时候架构越简单,除错时间会
越短。
作者: loadingN (sarsaparilla)   2023-01-01 10:12:00
mq够简单了吧... 要转换到其他地方也不难
作者: ddoll288 (风儿卿卿)   2023-01-01 10:58:00
火山表示___
作者: alan3100 (BOSS)   2023-01-01 12:01:00
..哪个语言没内建mq
作者: LincolnBoy   2023-01-01 13:01:00
楼上那篇怎么删文了
作者: alan3100 (BOSS)   2023-01-01 14:17:00
mq外部化可以让上下游达到statelesssubscriber每个语言都有 不太会自己实作多少秒观察一次
作者: TSW (翘班帝国)   2023-01-02 06:56:00
感觉只是为了写而写....
作者: Murasaki0110 (麦当劳欢乐送)   2023-01-02 09:48:00
语言dependent又不scalable,算什么系统设计?随便哪个mq维护成本也比维护这土炮架构好
作者: lance70176 (十三夜)   2023-01-03 07:46:00
MQ 设计好多了吧
楼主: appleboy46 (小恶魔)   2023-01-04 11:50:00
用 MQ 处理长时间的任务,可能会遇到底下问题1. 如何取得目前任务的状态?2. 如何设定任务超时机制?3. 如何跨服务取消任务?4. 当 Worker 失去连线或不正常关闭,该如何让 Task可以重新执行?5. 当有多台 Server + 多台 Worker 时,该如何配送任务及取消任务?
作者: alan3100 (BOSS)   2023-01-04 22:12:00
..你没用过mq吧 不然应该不会问4&5别说task派送和取消了 现在还有跨服务交易但不绑连线可以查saga pattern.
作者: peter98 (新兵)   2023-01-04 23:31:00
原po需要好好了解系统设计 人家如果问你"如何取消正在执行的工作任务" 你在面试中会被炮到你完全无法讲答案因为你回答的不是系统设计*你在面试中"这样答"会被炮到你完全无法讲答案你这题答案所对应的问题是: 如何实作一个MQ来实现基本的工作任务取消" 多注意点就好 感觉你没面试过系统设计题目 或者你面试的公司比较low 不知道什么是系统设计另外有认真做过硕论的话 不应该发生妳这样的问题就是你的标题跟本文如果对应到硕论题目跟本文(这边不论这东西是否适合作为一个硕论题目) 你早就被教授炮到台上回家哭也不是 不哭也不是。。。百分之百被炮的
作者: leolarrel (真.粽子无双)   2023-01-05 10:59:00
现在刷leet code 才是高手保证.系统设计? 那是啥
作者: w0005151 (蓝厅)   2023-01-05 14:01:00
其实除了那几间大公司,现在考leetcode没那么普遍senior以上都还满注重系统设计的
楼主: appleboy46 (小恶魔)   2023-01-05 15:21:00
了解了,我在把标题定义清楚些感谢 @peter98 及 @alan3100 建议
作者: lovdkkkk (dk)   2023-01-06 00:07:00
上述 12345 MQ, 纯 http, 纯 socket, 纯 channel 或混用应该都做得到, 只是实作花的时间跟运行成本可能有差它们都只是通讯手段, 只是有的单向有的双向, 有的帮你排好序, 有的提供端点识别或方便的广播, 或自动重送重试需要实现的其实也只有 1. 对特定 server/worker 发送2. 广播, 3. 针对特定 task 下指令 三件事系统设计是很多方法都做得到再去做取舍, 如果很明确只有特定方法才做得到的事情就不用设计了, 反正没得选
楼主: appleboy46 (小恶魔)   2023-01-06 09:49:00
公司内部特定环境,没办法使用 MQ 等相关 Component所以才有了这些方法跟机制来实现。
作者: ma721 (UndeadJ)   2023-01-09 17:06:00
ctrl alt del

Links booklink

Contact Us: admin [ a t ] ucptt.com