k8s 中同一个服务开启了多个副本,如何退出特定副本中的协程?

2021-11-10 15:00:56 +08:00
 777777

业务场景

该服务是执行多个数据收集任务,每个任务起一个协程,用户取消正在运行的任务,协程退出。

遇到的问题

不知道这个任务运行在哪个副本当中,k8s 服务存在负载均衡。

1295 次点击
所在节点    Go 编程语言
4 条回复
saltbo
2021-11-10 17:24:32 +08:00
我猜一下你的问题:现在需要停止一个程序里的一个协程,但是这个程序部署在多个副本上。你希望通过 api 来触发停止逻辑,但是因为负载均衡导致 api 请求可能被负载到任意副本上去,而被负载的副本上可能并没有你想要停止的那个协程。

如果是这种问题,有两种情况。
一、如果你程序的存储是用的文件或者内存,那么只能让负载均衡采用哈希算法,保证创建任务的请求和停止任务的请求路由到同一个副本上。
二、如果你的程序用的是其他中心化存储如 mysql 或消息队列。这种情况应该将任务的创建流程和任务的消费流程分离开,创建任务后任务在哪个副本运行记录到数据库中,停止时先去数据库查询,然后标记停止。消费端 watch 到停止标记进行停止。(大概思路供参考,具体情况要看技术选型而定)
motecshine
2021-11-10 17:34:36 +08:00
argo workflow
SmiteChow
2021-11-10 17:47:47 +08:00
1. 协程需要有一个 uuid 并关联任务 uuid
2. 需要再起一个 manager 协程用来管理干活的 worker 协程
3. ( 2 选 1 ) manager 轮询 db 拉需要关闭的协程的 uuid
3. ( 2 选 1 ) manager 订阅事件(需要额外中间件支撑)获得需要关闭的协程的 uuid
777777
2021-11-10 18:20:09 +08:00
感谢大家的方案,我准备采用全副本订阅 mq 然后终止协程这个方案

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/814415

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX