DFB*_*DFB 3 google-cloud-platform google-cloud-functions java-11
我使用 Java 11 (Beta) 运行时创建了一个新的 Cloud Functions 函数来处理我的静态站点的 HTML 表单提交。这是一个简单的 3 字段表单(姓名、电子邮件、消息)。不涉及文件上传。该函数主要做两件事:
注意:它还会验证 recaptcha,但我已将其禁用以进行测试。
在我的本地机器(基本型号 2019 Macbook Pro 13")上运行该功能大约需要 3 秒。我在东南亚。部署到 Google Cloud us-central1 的相同功能大约需要 25 秒(慢 8 倍) . 我有几乎相同的代码在生产中作为 Servlet on GAE Java 8 运行时的一部分也在美国中部地区运行了几年。大约需要 2-3 秒,包括 recaptcha 验证和发送电子邮件。我正在尝试将其移植到 Cloud Function,但即使没有 recaptcha 验证,Cloud Function 的性能也会降低约 10 倍。
相比之下,Cloud Function 在 256MB / 400GHz 实例上运行,而我的 GAE Java 8 运行时在 F1 (128MB / 600GHz) 实例上运行。该函数仅使用大约 75MB 的内存。该函数被配置为接受未经身份验证的请求。
我注意到,即使是基本的字符串连接,如:String c = a + b;在云函数上也需要 100 毫秒。我对调用进行了计时,将大约 15 个字符串连接成一个简单的字符串大约需要 1.5-2.0 秒。
此外,将一条小消息(~ 1KB)写入 HTTPUrlConnection 输出流并读取响应大约需要 10 秒(是秒)!
/* Writing < 1KB to output stream takes about 4-5 secs */
wr = new OutputStreamWriter(con.getOutputStream());
wr.write(encodedParams);
wr.flush();
wr.close();
/* Reading response also take about 4-5 secs */
String responseMessage = con.getResponseMessage();
Run Code Online (Sandbox Code Playgroud)
同样,下面的 SendGrid 代码又需要 10 秒才能发送电子邮件。在我的本地机器上大约需要 1 秒。
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;
}
Run Code Online (Sandbox Code Playgroud)
云函数显然有问题。由于我的原始代码在 GAE Java 8 运行时上运行,因此我很容易将其移植到 Cloud Function 中,只需稍作改动。否则我会选择 NodeJS 运行时。在我的本地机器上运行此功能时,我也没有看到任何性能问题。
有人可以帮助我理解性能缓慢的问题吗?
您所看到的几乎可以肯定是由于与创建新服务器实例来处理请求相关的“冷启动”成本。这是所有类型的 Cloud Functions 的问题,如文档中所述:
本文档中的一些建议围绕所谓的冷启动展开。函数是无状态的,执行环境往往是从头开始初始化,称为冷启动。冷启动可能需要大量时间才能完成。最佳做法是避免不必要的冷启动,并尽可能简化冷启动过程(例如,通过避免不必要的依赖)。
我预计 JVM 语言的冷启动时间会更长,因为除了服务器实例本身之外,初始化 JVM 需要花费大量时间。
除了上面的建议之外,几乎没有什么可以有效缓解冷启动的。使函数保持温暖的努力并不像您想象的那么有效。如果您想搜索,互联网上有很多关于此的讨论。
请记住,Java 运行时也处于测试阶段,因此您可以期待未来的改进。其他运行时也发生了同样的事情。
| 归档时间: |
|
| 查看次数: |
251 次 |
| 最近记录: |