V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ff1m80
V2EX  ›  程序员

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

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

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

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

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

    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
        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 章分布式计算对消息队列、并行计算有详细讲解。
    uselessVisitor
        20
    uselessVisitor  
       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   ·   实用小工具   ·   966 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:23 · PVG 04:23 · LAX 12:23 · JFK 15:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.