我有一个Java lambda,当前正在将文件从S3复制到/ tmp。根据Lambda实例的大小,这需要6到10秒。该文件可在使用同一Lambda实例的新调用上重新使用。但是,流量非常刺耳,我可以看到同时出现50多个请求,并且S3的冷启动副本是不可接受的...
是否有比从S3复制更好的方法将数据“预加载”到Lambda实例中?如何通过HTTP请求从Cloudfront中获取缓存的副本。在有初始启动数据要求时,是否还有其他“技巧”可以加快冷启动速度?
答案:是请参见下文
答案 0 :(得分:0)
答案:是
从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();
}
希望这对其他人有帮助。
悬崖