客户端超时到AWS ALB之后的EC2中的Docker上的NodeJS

时间:2019-09-18 14:10:36

标签: node.js aws-alb

我在EC2实例的Docker容器中有一个Koajs节点应用程序。该应用程序位于AWS Application Load Balancer后面。

该应用程序仅获取一个POSTed文件,并以客户端可以查看事件的流进行响应。

因此,我的服务器在做正确的事情(发送文件数据),而我的客户端在做正确的事情(接收文件数据并发送进度),但是ALB正在超时。我不明白为什么会超时。客户端和服务器都在互相发送和接收数据,因此我认为这可以作为保持活动流量的条件。

这是每个人正在运行的代码。 客户:

const request = require('request-promise');
const fs = require('fs');

const filePath = './1Gfile.txt';
const file = fs.createReadStream(filePath);

(async () => {
  // PUT File
  request.put({
    uri: `http://server/test`,
    formData: { file },
    headers: { Connection: 'keep-alive' },
    timeout: 200000,
  })
    .on('data', (data) => {
      const progressString = data.toString();
      console.log({ progressString });
    });
})();

服务器:

const { Readable } = require('stream');                                                                                                                     
const Koa = require('koa');                                                                                                                                 
const router = require('koa-router')();                                                                                                                     

(async () => {                                                                                                                                              
  const app = module.exports = new Koa();                                                                                                                   

  router.get('/healthcheck', async (ctx) => {                                                                                                               
    ctx.status = 200;                                                                                                                                       
  });                                                                                                                                                       

  router.put('/test', test);                                                                                                                                

  async function test(ctx) {                                                                                                                                
    const read = new Readable({                                                                                                                             
      objectMode: true,                                                                                                                                     
      read() { },                                                                                                                                           
    });                                                                                                                                                     
    ctx.body = read;                                                                                                                                        

    let i = 1;                                                                                                                                              
    setInterval(() => {                                                                                                                                     
      read.push(`${process.hrtime()}, ${i}`);                                                                                                               
      ctx.res.write('a');                                                                                                                                   
      i++;                                                                                                                                                  
    }, 3000);                                                                                                                                               
  }                                                                                                                                                         

  app.use(router.routes());                                                                                                                                 
  app.use(router.allowedMethods());                                                                                                                         

  app.listen(3000, (err) => {                                                                                                                               
    if (err) throw err;                                                                                                                                     
    console.info(`App started on port 3000 with environment localhost`);                                                                                    
  });                                                                                                                                                       
})();   

服务器和客户端都在记录正确的内容,但是ALB只是在我将其设置为空闲超时时超时。有什么技巧可以告诉ALB流量确实在流动吗?

非常感谢您能在上面照亮一切。

1 个答案:

答案 0 :(得分:0)

快速猜测一下,您需要在使用request-promise时启用 keepAlive 。在选项中添加forever: true。试试这个:

request.put({
    uri: `http://server/test`,
    formData: { file },
    headers: { Connection: 'keep-alive' },
    timeout: 200000,
    forever: true,
  })

我们在使用request-promise-native时也存在超时问题。我们通过添加此选项进行了修复。希望它对您有用。