Google cloud platform 谷歌云功能Java 11(测试版)运行时-性能问题
我已经使用Java11(Beta)运行时创建了一个新的云函数来处理静态站点的HTML表单提交。这是一个简单的三字段表单(姓名、电子邮件、消息)。不涉及文件上传。该函数主要做两件事:Google cloud platform 谷歌云功能Java 11(测试版)运行时-性能问题,google-cloud-platform,google-cloud-functions,java-11,Google Cloud Platform,Google Cloud Functions,Java 11,我已经使用Java11(Beta)运行时创建了一个新的云函数来处理静态站点的HTML表单提交。这是一个简单的三字段表单(姓名、电子邮件、消息)。不涉及文件上传。该函数主要做两件事: 使用BitBucket创建拉取请求 使用SendGrid向我发送电子邮件 注意:它也会验证recaptcha,但我已经在测试中禁用了它 在我的本地机器(基本型号2019 Macbook Pro 13)上运行该功能大约需要3秒。我位于东南亚。部署到Google Cloud us-central1上的相同功能大约需要25
stringc=a+b;
这样的基本字符串连接,云函数也需要100毫秒的时间。我对调用进行了计时,一个简单的字符串连接大约需要1.5-2.0秒
此外,向HTTPUrlConnection输出流写入一条小消息(~1KB)并读回响应大约需要10秒(是秒)
云函数显然有点问题。由于我的原始代码是在GAE Java 8运行时上运行的,所以我很容易将其移植到云函数,只需稍作修改。否则,我会选择NodeJS运行时。在本地计算机上运行此函数时,我也没有看到任何性能问题
Email from = new Email(fromEmail, fromName);
Email to = new Email(toEmail, toName);
Email replyTo = new Email(replyToEmail, replyToName);
Content content = new Content("text/html", body);
Mail mail = new Mail(from, subject, to, content);
mail.setReplyTo(replyTo);
SendGrid sg = new SendGrid(SENDGRID_API_KEY);
Request sgRequest = new Request();
Response sgResponse = null;
try {
sgRequest.setMethod(Method.POST);
sgRequest.setEndpoint("mail/send");
sgRequest.setBody(mail.build());
sgResponse = sg.api(sgRequest);
} catch (IOException ex) {
throw ex;
}
有人能帮我解释一下性能缓慢的问题吗?您所看到的几乎肯定是由于创建新服务器实例来处理请求所带来的“冷启动”成本。这是所有类型的云功能都存在的问题,如下所述: 本文档中的一些建议围绕所谓的冷启动展开。函数是无状态的,执行环境通常是从头开始初始化的,这称为冷启动。冷启动可能需要花费大量时间来完成。避免不必要的冷启动和简化流程是最佳做法在任何可能的范围内(例如,通过避免不必要的依赖性)冷启动过程 我希望JVM语言有更长的冷启动时间,因为除了服务器实例本身之外,初始化JVM所需的时间也更长 除上述建议外,有效缓解冷启动的方法非常少。这些方法的效果不如你想象的那么好。如果你想搜索,互联网上有很多关于这方面的讨论
请记住,Java运行时也处于测试阶段,因此您可以期待将来的改进。其他运行时也发生了同样的情况。您是对的。这是我第一次使用GCF。我想我检查了冷启动时间,但显然没有。我重新测试了它,第二个请求在2.2秒内完成。我只得到about 25条评论/周,每个请求的15-20秒冷启动延迟是不可接受的(假设它们分散几个小时)。我已经在使用cron技巧通过每5分钟ping一次来保持我的GAE实例的活动。我将使用GCF尝试同样的方法并查看。我原以为GCF至少可以保持一个实例的活动,但我错了。非常感谢您的帮助。我希望能对您有所帮助
Email from = new Email(fromEmail, fromName);
Email to = new Email(toEmail, toName);
Email replyTo = new Email(replyToEmail, replyToName);
Content content = new Content("text/html", body);
Mail mail = new Mail(from, subject, to, content);
mail.setReplyTo(replyTo);
SendGrid sg = new SendGrid(SENDGRID_API_KEY);
Request sgRequest = new Request();
Response sgResponse = null;
try {
sgRequest.setMethod(Method.POST);
sgRequest.setEndpoint("mail/send");
sgRequest.setBody(mail.build());
sgResponse = sg.api(sgRequest);
} catch (IOException ex) {
throw ex;
}