请教一个后端开发问题,可能是多线程相关。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
ff1m80
V2EX    程序员

请教一个后端开发问题,可能是多线程相关。

  •  
  •   ff1m80 2021-04-19 09:47:10 +08:00 via Android 3575 次点击
    这是一个创建于 1637 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人对后端开发刚开始学习,没有形成知识体系,所以有个疑问:

    假如用户发起一个请求后,我们会直接处理这个请求,然后返回给用户响应,如果同时这个请求会触发一些额外的并不需要响应给用户的任务,比如写入日志。这个额外任务的处理方案是如何设计的,另开一个线程?

    因为不知道这个问题该如何精准地用词汇表达,所以没找到理想的搜索结果。还请赐教,有个搜索关键词做为指南也是很好的。

    22 条回复    2021-04-22 09:29:27 +08:00
    maocat
        1
    maocat  
       2021-04-19 09:49:13 +08:00
    异步任务处理
    ruiyi1994
        2
    ruiyi1994  
       2021-04-19 09:50:25 +08:00
    logger->info("xx");
    logger->warn("xx");
    logger->error("xx");
    logger->fatal("xx");
    可以直接写日志, 很多日志库都是异步的, 后台会有一个写日志线程.写的日志会进入到这个线程内的队列中,然后定期 flush 写入磁盘.
    ff1m80
        3
    ff1m80  
    OP
       2021-04-19 09:52:07 +08:00 via Android
    @maocat 好的感谢,我搜索下异步任务相关知识
    Kasumi20
        4
    Kasumi20  
       2021-04-19 09:52:50 +08:00
    切面
    ff1m80
        5
    ff1m80  
    OP
       2021-04-19 09:53:43 +08:00 via Android
    @ruiyi1994 日志是举个例子,不过我了解了,知识点是在异步任务处理
    jesson
        6
    jesson  
       2021-04-19 10:03:41 +08:00
    建议上消息队列,能极大的解耦
    fantastM
      &nsp; 7
    fantastM  
       2021-04-19 10:04:45 +08:00
    做异步处理不一定要另开一个线程,还有其它的方式,比如消息中间件
    wind3110991
        8
    wind3110991  
       2021-04-19 10:13:28 +08:00
    1.可以在封装一个异步 API,每次日志请求这个 API,在一个单独的线程中处理,写入外部存储,不阻塞主流程
    2.可以使用一个 udp svr 来接受日志,udpsvr 负责缓冲写入存储
    3.可以使用一个 tcp svr 来接受日志,或者用中间件,比如使用 kafka broker 作为缓冲中间件,可以把 ack 设置为 0,实现快速写入日志
    ff1m80
        9
    ff1m80  
    OP
       2021-04-19 10:14:24 +08:00 via Android
    感谢楼上的,知识点挺多,我有方向了。
    ch2
        10
    ch2  
       2021-04-19 10:19:25 +08:00 via iPhone
    直接 print 就行,输出重定向
    4kingRAS
        11
    4kingRAS  
       2021-04-19 10:39:21 +08:00   1
    刚好做过,http get/post 进来,返回结果之前会执行一些任务。看任务内容是什么,如果时间很长那就异步,如果只是一些逻辑,就直接顺序执行好了。异步要么是起一个线程放进线程池执行,要么是加入队列。执行完了再另外返回结果。
    ff1m80
        12
    ff1m80  
    OP
       2021-04-19 10:50:31 +08:00
    @4kingRAS 感谢大佬,收获颇丰。
    yeqizhang
        13
    yeqizhang  
       2021-04-19 11:06:38 +08:00 via Android
    线程池异步执行就可以,你举的日志例子不太好,一般的体量是一步步同步执行下来的,除非日志量大或者要分析,就 elk,或者异步发送到 kafka
    IvanLi127
        14
    IvanLi127  
       2021-04-19 12:31:50 +08:00 via Android
    其实你完全可以简单地,在响应完用户请求后,在当前线程继续其他操作。
    Rheinmetal
        15
    Rheinmetal  
       2021-04-19 12:48:23 +08:00
    可靠地完成就叫 Event Sourcing 了
    Dragonphy
        16
    Dragonphy  
       2021-04-19 13:55:11 +08:00
    AOP 不就可以吗
    ff1m80
        17
    ff1m80  
    OP
       2021-04-19 21:55:09 +08:00 via Android
    @yeqizhang 确实例子不太好,我本意是指与用户请求相关,耗时但不需要响应给用户的任务
    ff1m80
        18
    ff1m80  
    OP
       2021-04-19 21:55:55 +08:00 via Android
    @Dragonphy AOP 似乎是 JAVA 里的概念?
    ff1m80
        19
    ff1m80  
    OP
       2021-04-19 22:50:43 +08:00
    根据老哥们的指引,我找到了一些学习资料,有兴趣的同学可以看一下(其实关键词搜索,学习资料茫茫多啦):
    [消息队列的使用场景是怎样的?]( https://www.zhihu.com/question/34243607)
    另外,[构建高性能 Web 站点]( https://book.douban.com/subject/3924175/)这本书第 17 章分布式计算对消息队列、并行计算有详细讲解。
    zm8m93Q1e5otOC69
        20
    zm8m93Q1e5otOC69  
       2021-04-20 09:01:19 +08:00
    异步写入日志
    elintwenty
        21
    elintwenty  
       2021-04-20 14:33:30 +08:00
    直接谷歌搜索“不关心返回值的代码逻辑”,第一个返回的是 Java 的 future,顺着这条路就能找到“异步”的路
    Chinsung
        22
    Chinsung  
       2021-04-22 09:29:27 +08:00
    除了主流程,其他不需要响应的步骤都可以新起线程去做,比如写日志,比如发 mq 。当然最后的本质都是将这些事丢给其他线程去处理。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2710 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 09:01 PVG 17:01 LAX 02:01 JFK 05:01
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86