首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeJS到NodeJS http请求挂起

NodeJS到NodeJS http请求挂起
EN

Stack Overflow用户
提问于 2020-12-06 22:25:37
回答 1查看 61关注 0票数 1

我有两个服务: 1. worker 2.获取文档

两者都是Nodejs express服务。

worker使用Promise.all向fetch服务发送48个http POST (不要询问为什么post和not GET)请求,然后fetch服务获取所有48个文档(每个文档都在一个单独的请求中),并将它们发送回worker。

日志显示fetch服务成功地完成了所有操作,worker发送了所有48个请求,但显示了部分响应(有时为0,有时为15/48,有时为31/48,但从未完全成功)

工作人员似乎一直在等待响应,直到作业结束的15分钟超时结束,并将其移动到失败。

代码示例:

worker.js (服务1-带express的NodeJS )

代码语言:javascript
复制
        await Promise.all(docIDs.map(async (docID) => {

            try {

                logger.info(`Worker Get Document: Fetching ${docID.docID}  transaction ID: ${transactionId} / timeStamp: ${timeStamp}`, {})

                var document = await axios.post(getVariableValue("GET_DOCUMENT_SERVICE_URL"), docID, {
                    httpsAgent: new https.Agent({
                        rejectUnauthorized: false,
                        keepAlive: false
                    }),
                    auth: {
                        username: getVariableValue("WEBAPI_OPTIDOCS_SERVICE_USERNAME"),
                        password: getVariableValue("WEBAPI_OPTIDOCS_SERVICE_PASSWORD")
                    },
                    headers: {
                        "x-global-transaction-id": transactionId,
                        "timeStamp": timeStamp
                    }

                });

                logger.info(`Worker Get Document: Fetched ${docID.docID} Status: ${document.data.status}.  transaction ID: ${transactionId} / timeStamp: ${timeStamp}`, {})
                documents.push(document.data.content);

            }
            catch (err) {

                const responseData = err.response ? err.response.data : err.message

                logger.error(`Worker Get Document: Failed DocID ${docID.docID}, Error received from Get Document: ${responseData} - transaction ID: ${transactionId} / timeStamp: ${timeStamp}`, {})

                throw Error(responseData)

            }

        }));

fetch.js (服务2-带express的NodeJS )

代码语言:javascript
复制
module.exports = router.post('/getDocument', async (req, res, next) => {

    try {

        var transactionId = req.headers["x-global-transaction-id"]

        var timeStamp = req.headers["timestamp"]

        logger.info(`GetDocumentService: API started. - transaction ID: ${transactionId} / timeStamp: ${timeStamp}`, {})


        var document = await getDocuemntService(req.body, transactionId, timeStamp);

        var cloneDocument = clone(document)
        
        logger.info(`GetDocumentService: Document size: ${JSON.stringify(cloneDocument).length / 1024 / 1024}. - transaction ID: ${transactionId} / timeStamp: ${timeStamp}`, {})

        logger.info(`GetDocumentService: API Finished. - transaction ID: ${transactionId} / timeStamp: ${timeStamp}`, {})
        res.status(200);
        res.set("Connection", "close");
        res.json({
            statusDesc: "Success",
            status: true,
            content: cloneDocument
        });
      
        logger.info(`GetDocumentService: Response status: ${res.finished} . - transaction ID: ${transactionId} / timeStamp: ${timeStamp}`, {})
      
    }
    catch (err) {

        logger.error(`GetDocumentService: Error:${err.message} / Stack: ${err.stack}. - transaction ID: ${transactionId} / timeStamp: ${timeStamp}`, {})

        res.status(500)
        res.send("stack: " + err.stack + "err: " + err.message + " fromgetdocument")

    }

});

因此,get文档中的日志已满,并显示成功。

worker的日志如下所示:

“获取”X48

“获取”X0、X15、X31 (获取48个文档的三种不同尝试)

我已经尝试将keep-alive更改为true。

我可能还遗漏了什么?任何人都知道为什么它永远挂起(至少15分钟,直到作业“超时”)

谢谢:)

EN

回答 1

Stack Overflow用户

发布于 2020-12-07 00:48:48

我在这里只是猜测,但我觉得它们是很强的猜测。

  1. Axios的默认超时时间为none,但我猜在某个地方有900秒的超时时间。编辑:这个超时很可能发生在服务器端的web服务器上。
  2. 你在不到一秒的时间里用48个请求重创了服务器。我对此失败并不感到惊讶。
  3. 他们的服务器可能会限制您的速率,或者只是超载。

为了进行测试,请将您的请求限制为一次一个。当一个完成后,发送下一个。

简单的工作队列示例-未测试

addWork或doWork调用方需要等待

代码语言:javascript
复制
let queue = []
const sleep = (ms)=> new Promise((resolve)=>setTimeout(resolve,ms))

async addWork(work, cb, sleepMS) {
  if (Array.isArray(work) queue = [...queue, ...work]
  else queue.push(work)
  if (cb) return doWork(cb, sleepMS)
}

async doWork(cb, sleepMS) {
  let work = queue.pop()
  var document = await getDocuemntService(work)
  cb(document)
  if (queue.length > 0) {
    if (sleepMS) await sleep(sleepMS)
    return doWork(cb, sleepMS)
  }
}

一旦您确认一次一个有效,那么您就可以查看更复杂的工作队列。我会在NPM上查找一些东西,我确信有一些东西可以处理这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65169128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档