V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
weishijun14
V2EX  ›  问与答

nodejs 如何同时高性能的发送多个请求?

  •  
  •   weishijun14 · 2020-09-28 09:04:04 +08:00 · 1886 次点击
    这是一个创建于 1551 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教一下,nodejs 不是能用 http.get 发送请求么, 假设我要同时发十个请求,用 http.get 应该要怎么写比较好? 我自己知道的就是用 promise.all , 但是想知道有没有更加高性能的写法 /?

    // 我自己目前的写法:
    function fetchAll () {
      http.get('url1').then();
      http.get('url2').then();
      http.get('url3').then();
      http.get('url4').then();
      ...
      http.get('url10').then();
    }
    // 这里的十个请求肯定是并行不阻塞的,所以用起来并没有什么大问题。只是这样看起来
    // 不是很优雅。也不知道会不会有什么性能问题。
    
    4 条回复    2020-09-28 11:21:12 +08:00
    TomVista
        1
    TomVista  
       2020-09-28 10:26:05 +08:00
    把.then();的内容拆出去,写成函数,不要在 fetchAll 里放一堆,其他没什么.

    要优雅的话,用 node EventEmitter,拆分成观察者模式

    高性能,不用考虑,几十 几百并发 http,一般出问题在网络带宽上,
    ysc3839
        2
    ysc3839  
       2020-09-28 10:39:41 +08:00
    Promise.all 应该是最优解。
    你目前的写法,是因为 then 里面的处理代码完全不同吗?如果是不同的话那这么写也没什么问题了。
    还有要考虑的是使用的 http 库会不会自动复用连接以及是否支持 HTTP/2 。假设你这里的 url 全都是同一个域名,有的 http 库会自动使用同一个 TCP 连接,有的要主动创建一个 session 对象才会复用。会复用连接的情况下,HTTP/1.x 可能会降低性能,但 HTTP/2 则会提高性能。
    追求更高性能的话可能要用 C/C++ 写扩展了。
    weishijun14
        3
    weishijun14  
    OP
       2020-09-28 11:17:12 +08:00
    @TomVista @ysc3839

    感谢楼上大佬们的解答!
    按照解答来说的话,就是没啥大问题了。。。因为目前确实没有很大量的请求。。我先这么写着。。后期要调整的时候再来看看大佬们的方法。。
    zihuyishi
        4
    zihuyishi  
       2020-09-28 11:21:12 +08:00
    我觉得相对于 http 请求本身的时间,这里怎么写应该都不会影响到性能吧。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5412 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:36 · PVG 16:36 · LAX 00:36 · JFK 03:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.