首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当应用程序开始写入响应时,AWS CloudFront停止读取请求数据

问当应用程序开始写入响应时,AWS CloudFront停止读取请求数据
EN

Stack Overflow用户
提问于 2022-09-02 14:07:39
回答 1查看 107关注 0票数 0

解决方案具有以下请求流Client -> AWS CloudFront -> AWS ALB -> AWS EC2。AWS CloudFront,支持发布请求。

以下情况如下:

curl -v -H "Connection: close" --data-binary @<path to file> http://example.com/api)

  • Origin (Nodejs, EC2实例上的快速应用程序)接收请求,并将其输送到响应(下面提供的伪代码),
  1. CF在第一个字节被写入响应流后立即停止读取请求体。

因此,请求流不会产生'end‘事件(因为CF停止发送请求数据),应用程序不会关闭响应流,因此,客户端会超时。

直接使用AWS (没有AWS CloudFront)没有这个问题。因此,我现在的想法是,AWS希望Origin在开始发送任何响应字节之前使用所有请求数据。

这是一个巨大且不明显的限制..。

是对的吗?或者AWS CloudFront有一些头/选项可以适当地处理这个逻辑?

应用实例:

代码语言:javascript
复制
// no body-parser, etc
router.post(
    "/api",
    async (req: express.Request, res: express.Response) => {
      return pipeline(req, res, error => console.log('done', error));
    }
  );

作为一种临时解决方案,决定使用一个中间内存缓冲区来积累响应体,直到我读取所有请求输入数据。

代码语言:javascript
复制
// 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));
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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工作-应用程序仍然能够读取请求数据,即使在开始写入响应。

所以,整个解决方案被调整为

代码语言:javascript
复制
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北草坪会议大楼更适合这个用例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73583832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档