【问题标题】:Nodejs, multiple requests that takes timeNodejs,需要时间的多个请求
【发布时间】:2021-07-30 17:05:37
【问题描述】:

我有一个问题让我很忙,我想知道是否有人可以回答。

让我们假设我有一个快速应用程序来侦听发布请求, 这个发布请求触发了程序中的一个函数,该函数使用 axios 向服务调用超过 1000 次(就此而言,通过 api 调用发送一条短信的短信提供商)。 现在,假设 SMS 提供者的一个请求需要 200 毫秒,那么其中 1000 个请求将需要 2 分钟以上。 当然,我会在早些时候从服务器发送一个响应,说请求已收到。 我的问题是,假设同时有 20 个甚至 100 个请求,我怎样才能让应用程序处理这些流量?即使执行所有这些操作需要很长时间。

如何执行?有首选的语言吗? 节点可以吗?

【问题讨论】:

    标签: node.js express axios request


    【解决方案1】:

    如果您向多个用户广播相同的短信,您应该在短信 api 中搜索广播命令。这将减少服务器上所需的操作数/带宽。

    如果不存在广播支持,您应该在处理这些短信任务时获取其他请求。比如:

    function smsTask(n)
    {
         doSmsWork(function(response){ 
              if(n)
              {
                    setTimeout(function(){ 
                        smsTask(n-1);
                    },0);
              }
         })
    }
    
    smsTask(num);
    

    if(n)smsTask(n-1) 之间,其他异步任务可以抽出时间来工作,包括获取/拦截新的 smsTasks 和 RAM 需求仅取决于正在进行的请求数,而不是 sms 任务数。如果您需要限制所有 sms 任务的带宽,您可以为 setTimeout 函数使用动态等待值(而不是 0),这可以将更多带宽专用于其他任务(如服务网页等),而不是被垃圾短信完全消耗。

    如果您不要求异步处理新请求,那么您可以在 2 分钟内完成每个请求的整个工作,前提是其 I/O 受限:

    function smsTask(n)
    {
         for(let i=0;i<n;i++)
             doSmsWork(function(response){ 
              
             })
    }
    
    smsTask(num);
    

    在完美的 I/O 条件下,即使 n=1000,这也可以在 200ms-300ms 内完成。这仍然不会停止新任务/请求,但会给队列带来太大压力,并且可能会消耗更多内存,而其他版本仅根据飞行中的请求数量保持稳定的内存消耗。

    如果您需要更少的 I/O 争用,您可以将任务放入队列中,并有一个专门的函数来处理队列:

    let work = [];
    function smsTask(n){ work.push(some_task(n)); }
    
    setInterval(function(){
        if(work.length > 0)
        {
            let task = work.shift();
            task?.compute(); // does sms work
        }
    },1000);
    

    这是一种稳态处理,只要工作队列没有溢出内存,它就不会因为突然的请求高峰而停止。也许这个的 setTimeout 版本更适合 CPU。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 2020-03-19
      • 2019-08-21
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多