我在 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 流量确实在流动?
非常感谢您提供的任何信息。