Aws lambda Lambda冷启动-从S3复制文件

Aws lambda Lambda冷启动-从S3复制文件,aws-lambda,Aws Lambda,我有一个javalambda,它正在将一个文件从S3复制到/tmp。这需要6-10秒,具体取决于Lambda实例的大小。该文件将在使用相同Lambda实例的新调用中重新使用。然而,流量是非常尖利的,我可以看到50多个同时请求进来,来自S3的冷启动拷贝是不可接受的 有没有比从S3复制更好的方法将数据“预加载”到Lambda实例中?一个HTTP请求从Cloudfront获取一个缓存副本怎么样。当有初始启动数据要求时,是否有其他加速冷启动的“技巧” 回答:是见下文回答:是 从CloudFront前面的

我有一个javalambda,它正在将一个文件从S3复制到/tmp。这需要6-10秒,具体取决于Lambda实例的大小。该文件将在使用相同Lambda实例的新调用中重新使用。然而,流量是非常尖利的,我可以看到50多个同时请求进来,来自S3的冷启动拷贝是不可接受的

有没有比从S3复制更好的方法将数据“预加载”到Lambda实例中?一个HTTP请求从Cloudfront获取一个缓存副本怎么样。当有初始启动数据要求时,是否有其他加速冷启动的“技巧”


回答:是见下文

回答:是

从CloudFront前面的S3托管桶中使用GZip会更快。在1.5MB文件上,我看到性能从12秒提高到了4秒。以下是我为此编写的代码:

void getFile(String remoteUrl) throws Exception {

    URL url = new URL(remoteUrl); 
    HttpsURLConnection con = (HttpsURLConnection)url.openConnection();

    con.setRequestProperty("Accept-Encoding", "gzip");

    BufferedInputStream bis;
    if ("gzip".equals(con.getContentEncoding())) {
        bis = new BufferedInputStream(new GZIPInputStream(con.getInputStream()));
    }
    else {
        bis = new BufferedInputStream(con.getInputStream());
    }

    String getPath = url.getPath();
    String fileName = "/tmp/"+getPath.substring(getPath.lastIndexOf('/') + 1);

    BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fileName));
    byte[] buff = new byte[16 * 1024];
    int len;
    while ((len = bis.read(buff)) > 0)
        out.write(buff, 0, len);
    bis.close();
    out.close();
}
我希望这对其他人有帮助


悬崖回答:是的

从CloudFront前面的S3托管桶中使用GZip会更快。在1.5MB文件上,我看到性能从12秒提高到了4秒。以下是我为此编写的代码:

void getFile(String remoteUrl) throws Exception {

    URL url = new URL(remoteUrl); 
    HttpsURLConnection con = (HttpsURLConnection)url.openConnection();

    con.setRequestProperty("Accept-Encoding", "gzip");

    BufferedInputStream bis;
    if ("gzip".equals(con.getContentEncoding())) {
        bis = new BufferedInputStream(new GZIPInputStream(con.getInputStream()));
    }
    else {
        bis = new BufferedInputStream(con.getInputStream());
    }

    String getPath = url.getPath();
    String fileName = "/tmp/"+getPath.substring(getPath.lastIndexOf('/') + 1);

    BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fileName));
    byte[] buff = new byte[16 * 1024];
    int len;
    while ((len = bis.read(buff)) > 0)
        out.write(buff, 0, len);
    bis.close();
    out.close();
}
我希望这对其他人有帮助


Cliff

这个文件有多大?所讨论的具体文件是1.5MB,我是使用GetObject从S3中提取的。我决定将我的文件部署到由CloudFront前置的托管存储桶中,并使用Gzip尝试此HTTP(s)请求将数据拉入Lambda。好消息,我让它工作了,我看到我的Lambda初始化时间从12-15秒下降到4秒左右(使用640MB)实例,并将https文件流以16K块写入/tmp。块大小在我的测试中似乎没有多大关系,但我想限制Lambda中的内存分配。我将编辑我的问题并发布代码。这个文件有多大?具体的文件是1.5MB,我使用GetObject从S3中提取的。我决定将我的文件部署到由CloudFront前置的托管存储桶中,并使用Gzip尝试此HTTP(s)请求将数据拉入Lambda。好消息,我让它工作了,我看到我的Lambda初始化时间从12-15秒下降到4秒左右(使用640MB)实例,并将https文件流以16K块写入/tmp。块大小在我的测试中似乎没有多大关系,但我想限制Lambda中的内存分配。我将编辑我的问题并发布代码。上面的代码假定为HTTPS URL。使用HTTP可能会进一步提高性能(使用风险自负!)以上代码假设使用HTTPS URL。使用HTTP可能会进一步提高性能(使用风险自负!)