0

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

该应用程序只需获取一个 POST 文件并使用客户端可以查看事件的流进行响应。

所以我的服务器正在做正确的事情(发送文件数据),我的客户端正在做正确的事情(接收文件数据并发送回进度),但 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 流量确实在流动?

非常感谢您提供的任何信息。

4

1 回答 1

0

只是一个快速的猜测,你需要在使用时启用keepAliverequest-promise。添加forever: true选项。尝试这个:

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

我们在使用时遇到了类似的超时问题request-promise-native。我们通过添加此选项进行了修复。希望它适合你。

于 2019-09-18T14:31:16.370 回答