【发布时间】:2020-07-05 02:45:28
【问题描述】:
我使用 Java 11(Beta)运行时创建了一个新的云函数来处理我的静态站点的 HTML 表单提交。这是一个简单的 3 字段表单(姓名、电子邮件、消息)。不涉及文件上传。该函数主要做两件事:
- 使用 BitBucket 创建拉取请求
- 使用 SendGrid 向我发送电子邮件
注意:它也会验证 recaptcha,但我已将其禁用以进行测试。
在我的本地计算机(基本型号 2019 Macbook Pro 13")上运行该功能大约需要 3 秒。我位于东南亚。部署到 Google Cloud us-central1 时相同的功能大约需要 25 秒(8慢了几倍)。我在生产中运行几乎相同的代码,作为 GAE Java 8 运行时的 Servlet 的一部分,也在美国中部地区运行了几年。包括 recaptcha 验证和发送电子邮件大约需要 2-3 秒。我我尝试将其移植到 Cloud Function 上,但使用 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();
同样,下面的 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;
}
云功能明显有问题。由于我的原始代码是在 GAE Java 8 运行时上运行的,因此我很容易将其移植到 Cloud Function 上,只需稍作改动即可。否则我会选择 NodeJS 运行时。在本地机器上运行此功能时,我也没有看到任何性能问题。
有人可以帮我理解性能缓慢的问题吗?
【问题讨论】:
-
希望this article对你有帮助
标签: google-cloud-platform google-cloud-functions java-11