V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
777777
V2EX  ›  Go 编程语言

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

  •  
  •   777777 · 2021-11-10 15:00:56 +08:00 · 1287 次点击
    这是一个创建于 890 天前的主题,其中的信息可能已经有所发展或是发生改变。

    业务场景

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

    遇到的问题

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

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

    如果是这种问题,有两种情况。
    一、如果你程序的存储是用的文件或者内存,那么只能让负载均衡采用哈希算法,保证创建任务的请求和停止任务的请求路由到同一个副本上。
    二、如果你的程序用的是其他中心化存储如 mysql 或消息队列。这种情况应该将任务的创建流程和任务的消费流程分离开,创建任务后任务在哪个副本运行记录到数据库中,停止时先去数据库查询,然后标记停止。消费端 watch 到停止标记进行停止。(大概思路供参考,具体情况要看技术选型而定)
    motecshine
        2
    motecshine  
       2021-11-10 17:34:36 +08:00
    argo workflow
    SmiteChow
        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
    777777
        4
    777777  
    OP
       2021-11-10 18:20:09 +08:00
    感谢大家的方案,我准备采用全副本订阅 mq 然后终止协程这个方案
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2876 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 15:19 · PVG 23:19 · LAX 08:19 · JFK 11:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.