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

Java 后台请求多个不相关的接口,如果才能提高效率?

  •  
  •   luxinfl · 2021-11-25 09:23:34 +08:00 · 3099 次点击
    这是一个创建于 1099 天前的主题,其中的信息可能已经有所发展或是发生改变。

    试过了 parallelStream 和多个 CompletableFuture 的 join ,发现性能差别不是很大。大神们还有啥好的实践方法麽?

    第 1 条附言  ·  2021-11-26 08:50:27 +08:00
    踩了个坑,涉及到网络 io 的时候,还要注意下 http 连接池的配置,尤其是 maxTotal 和 defaultMaxPerRoute ,这玩意和线程池配置不当,容易卡在获取连接那。。。
    20 条回复    2021-11-26 14:31:55 +08:00
    cxshun
        1
    cxshun  
       2021-11-25 09:25:56 +08:00
    ParallelStream 实际上底层也是维护自己的 ForkjoinPool ,如果你说的多个,多到超过 CPU 核数,那可能定义自己的 ForkjoinPool 去提交 ParallelStream 会更合适点。

    如果觉得 ParallelStream 那种 WorkSteal 的方式对你不大适用,那直接使用多线程就行了。

    PS:性能差别本来这两种就是类似的。但如果你发现并行和串行差别不大,那就要考虑是不是业务提供方性能不行。
    awalkingman
        2
    awalkingman  
       2021-11-25 09:28:04 +08:00
    自己维护个线程池,异步并发去请求多个接口。用 parallelStream 和 CompletableFuture 貌似都是全局的池子
    tairan2006
        3
    tairan2006  
       2021-11-25 09:31:57 +08:00
    CompletableFuture 可以注入自定义的线程池
    admol
        4
    admol  
       2021-11-25 09:32:56 +08:00
    CompletableFuture 可以指定自定义的线程池
    luxinfl
        5
    luxinfl  
    OP
       2021-11-25 09:46:45 +08:00
    @admol
    @tairan2006
    @newskillsget
    两个都是用了自定义的线程池,并行流用的自定义 ForkJoinPool ,CF 用的普通的池子
    luxinfl
        6
    luxinfl  
    OP
       2021-11-25 09:49:04 +08:00
    @cxshun 现在采用的就是多个 CF 的写法,然后一起 join ,等待所有接口调用完毕才走到下一步。提供方的接口性能确实也不好。我也怀疑是不是网络时延太高,h 都是 http 调用
    fdgdbr
        7
    fdgdbr  
       2021-11-25 09:50:48 +08:00
    @luxinfl #6 打日志看下每个提供方接口的耗时不就知道了
    chengyulong
        8
    chengyulong  
       2021-11-25 09:52:23 +08:00
    提供方接口如果性能不好 就是搞再多的异步也不好使,考虑换对接方式吧
    sagaxu
        9
    sagaxu  
       2021-11-25 09:53:49 +08:00 via Android
    看看总耗时比最耗时的接口长多少,接口耗时是没办法的
    ixx
        10
    ixx  
       2021-11-25 10:07:33 +08:00
    差别不大可能是请求处理时间本身就很快
    golangLover
        11
    golangLover  
       2021-11-25 10:39:37 +08:00 via Android
    你以前好像已经问过了吧
    luxinfl
        12
    luxinfl  
    OP
       2021-11-25 10:41:48 +08:00
    @fdgdbr
    @chengyulong
    @sagaxu
    我是觉得这种异步方式会不会很耗时。因为有的接口服务方返回的很快,就几毫秒。但是我服务打的 http 调用时间,差了八九倍。
    luxinfl
        13
    luxinfl  
    OP
       2021-11-25 10:42:49 +08:00
    @golangLover 发过类似的,仅仅是使用方法
    fdgdbr
        14
    fdgdbr  
       2021-11-25 10:47:07 +08:00
    @luxinfl #12 虽然我觉得异步的方式不会引起耗时增加,但是你这么怀疑的话,那就用同步的方式依次调用,把每次调用的耗时都打出来,不就能验证你的怀疑了
    yidinghe
        15
    yidinghe  
       2021-11-25 11:00:37 +08:00 via Android
    问楼主个不相干的问题,为什么要把“如何”打成“如果”?这是拼音容易打错还是五笔容易打错?
    OkabeRintaro
        16
    OkabeRintaro  
       2021-11-25 15:10:45 +08:00
    @yidinghe 语音输入吧
    luxinfl
        17
    luxinfl  
    OP
       2021-11-25 19:55:27 +08:00
    @yidinghe 9 键键盘太小,容易多点
    Salticey
        18
    Salticey  
       2021-11-25 21:35:07 +08:00
    @yidinghe 打五笔不是会把“如何”打成“如果”的,打成“好吓人“才差不多~
    nekoyaki
        20
    nekoyaki  
       2021-11-26 14:31:55 +08:00
    @yidinghe 我还经常看见有人把“如何”打成如果,也想知道到底是怎么打的……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3528 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 10:45 · PVG 18:45 · LAX 02:45 · JFK 05:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.