解决方案具有以下请求流Client -> AWS CloudFront -> AWS ALB -> AWS EC2。AWS CloudFront,支持发布请求。
以下情况如下:
curl -v -H "Connection: close" --data-binary @<path to file> http://example.com/api)
因此,请求流不会产生'end‘事件(因为CF停止发送请求数据),应用程序不会关闭响应流,因此,客户端会超时。
直接使用AWS (没有AWS CloudFront)没有这个问题。因此,我现在的想法是,AWS希望Origin在开始发送任何响应字节之前使用所有请求数据。
这是一个巨大且不明显的限制..。
是对的吗?或者AWS CloudFront有一些头/选项可以适当地处理这个逻辑?
应用实例:
// no body-parser, etc
router.post(
"/api",
async (req: express.Request, res: express.Response) => {
return pipeline(req, res, error => console.log('done', error));
}
);作为一种临时解决方案,决定使用一个中间内存缓冲区来积累响应体,直到我读取所有请求输入数据。
// no body-parser, etc
router.post(
"/api",
async (req: express.Request, res: express.Response) => {
return pipeline(req, new Buffered(), res, error => console.log('done', error));
}
);
// Buffered.ts
import { Transform, TransformCallback } from "stream";
export class Buffered extends Transform {
private _acc: Array<Buffer> = [];
_transform(
chunk: Buffer,
encoding: BufferEncoding,
callback: TransformCallback
) {
this._acc.push(chunk);
callback();
}
_flush(callback: TransformCallback) {
callback(null, Buffer.concat(this._acc));
}
}发布于 2022-09-07 11:41:23
部分解决了问题。
AWS、CloudFront和AWS应用程序负载均衡器在请求/响应流方面没有提供足够的透明度。最初,我认为是AWS CloudFront停止读取请求数据,但结果是AWS具有相同的行为(在大得多的文件上重新测试)。
最后,我发现了一个类似的问题AWS Loadbalancer terminating http call before complete http response is sent,并尝试使用AWS经典负载均衡器,and...it工作-应用程序仍然能够读取请求数据,即使在开始写入响应。
所以,整个解决方案被调整为
Client1 (api.example.com) -> AWS CLB -> EC2
^
| (only for some API)
Client2 (cdn.example.com) -> -> -> -> -> S3所有API端点都可以通过api.example.com获得,但其中一些(具有简单的请求/响应逻辑)也可以通过cdn.example.com来加快速度。
这种方法的缺点是AWS是“上一代”平衡器。很可能,AWS北草坪会议大楼更适合这个用例。
https://stackoverflow.com/questions/73583832
复制相似问题