该服务是执行多个数据收集任务,每个任务起一个协程,用户取消正在运行的任务,协程退出。
不知道这个任务运行在哪个副本当中,k8s 服务存在负载均衡。
1
saltbo 2021-11-10 17:24:32 +08:00 1
我猜一下你的问题:现在需要停止一个程序里的一个协程,但是这个程序部署在多个副本上。你希望通过 api 来触发停止逻辑,但是因为负载均衡导致 api 请求可能被负载到任意副本上去,而被负载的副本上可能并没有你想要停止的那个协程。
如果是这种问题,有两种情况。 一、如果你程序的存储是用的文件或者内存,那么只能让负载均衡采用哈希算法,保证创建任务的请求和停止任务的请求路由到同一个副本上。 二、如果你的程序用的是其他中心化存储如 mysql 或消息队列。这种情况应该将任务的创建流程和任务的消费流程分离开,创建任务后任务在哪个副本运行记录到数据库中,停止时先去数据库查询,然后标记停止。消费端 watch 到停止标记进行停止。(大概思路供参考,具体情况要看技术选型而定) |
2
motecshine 2021-11-10 17:34:36 +08:00
argo workflow
|
3
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 |
4
777777 OP 感谢大家的方案,我准备采用全副本订阅 mq 然后终止协程这个方案
|