V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NoKey
V2EX  ›  程序员

请问一下,异步执行用线程池还是用 mq

  •  
  •   NoKey · 20 天前 · 971 次点击
    想到一个情况,请教一下各位大佬。
    一个服务,内部有很多异步任务,如何确保异步任务的正确执行。
    如果采用线程池,那么为了确保不同类型的任务不会相互抢资源,就会创建很多线程池,每个类型的任务一个线程池,相同类型的任务用一个线程池自己内部竞争。
    如果采用 mq ,那么每种类型任务需要一个 topic ,然后视情况看各模块消费后是串行处理还是并行处理。
    如果采用 mq ,并且后续是并行处理,那么就是 mq 和线程池的结合。

    按照这个思路考虑下去,要给服务越来越大后,最终,是不是会尝试大量的线程池配置或者大量的 topic ,写各种消费者去消费。
    请假一下各位大佬,实际项目上,如何解决此类问题呢?谢谢
    6 条回复    2024-06-04 16:13:30 +08:00
    Ehco1996
        1
    Ehco1996  
       20 天前
    看复杂度和需求

    mq 其实就是外存,能保证程序 crash 之后也不丢,放线程池里就是完全相反的
    kanepan19
        2
    kanepan19  
       20 天前
    如果异步任务重要, 用个用建一个任务表,用状态去维护他。
    无论是,线程池还是 mq 都行。
    我个人觉的,不是很复杂的任务,丢线程池挺方便。 mq 拿到的任务,执行一半,重启了,还是执行失败,当然影响范围比较小。
    xinshoushanglu
        3
    xinshoushanglu  
       20 天前
    如果 任务不能丢失,有可靠性需求,那么不能用线程池 否则服务一重启发布 就丢了。
    反之不重要的话,如果有任务队列的 控制需求,比如控制执行到一半任务 想暂停,过段时间继续,那么还得用 MQ 控制 offset 。
    如果既不在意 任务丢失,也没有中途控制需求,只需要快点跑完眼前这批任务,那直接用线程池更合适,不用引入外部依赖来增加系统复杂度
    vivisidea
        4
    vivisidea  
       20 天前
    很多异步任务是什么量级?几千个?几万个?几十万个?

    线程池还是 mq ,我理解这两个并不是同一个角色,mq 的作用是分发任务,线程池是执行任务,或许你是想问 “是用单独的 mq 队列给 task 排队,还是用线程池内置的 blockingQueue 给 task 排队?”
    NoKey
        5
    NoKey  
    OP
       19 天前
    @vivisidea 其实,是不是也有类似的地方,执行任务,线程池一次能排出来的线程就那么几条,如果同时要执行的任务太多,那就需要排队了
    vivisidea
        6
    vivisidea  
       19 天前
    @NoKey 我问数据量的意思就是,如果任务数量不多,比如几千个,那每个 worker 直接从 db 查询 init 状态的任务即可,拿一条处理一条 init -> running -> finished ,没必要在其它地方再排一次队,都在 db 排队即可
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   951 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:23 · PVG 03:23 · LAX 12:23 · JFK 15:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.