我在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流量确实在流动吗?
非常感谢您能在上面照亮一切。
答案 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
时也存在超时问题。我们通过添加此选项进行了修复。希望它对您有用。