嘿 serverfault 的朋友们,
想象一下一家提供在 AWS 上运行服务的通用“软件即服务”公司(嘿,这就是我们)。这不需要什么火箭科学,标准的 Web 应用程序照常运行,最终用户智能手机应用程序也是如此。由于客户来自欧洲,自然而然,AWS eu-central-1 区域包含多个租户的所有内容。
现在销售成功赢得了一位客户澳大利亚- 到目前为止一切都很好,因为 Web 应用程序已经可以处理不同的时区、货币和地区。但是:澳大利亚是距离欧洲最远的地方(至少在地球上),因此现在需要相当长的往返时间。每个请求每个方向确实会多出大约 300 毫秒 - 400 毫秒(编辑:在评论中指出 RTT 时这是错误的,我们确实看到了 2x400ms = 800ms 的额外时间HTTPS要求)。
对于上述客户用于管理目的的 Web 应用程序,这完全没问题。渲染的 HTML 稍晚一些,但多亏了 CDN(CloudFront),资产不是问题。
但最终用户智能手机应用程序会受到影响,因为它执行的 JSON 请求较少,但数量较多。它感觉还算“还行”,但绝对不够敏捷。
现在的问题是:如何从最终用户的角度改善时间安排? 我们已经考虑了一些选择:
克隆完整软件并将其托管在 AWS ap-southeast-2 中
好处:性能卓越,易于设置,CI/CD 允许在欧盟和澳大利亚同时部署相同的代码。
缺点:我们必须维护并支付两套相同的基础设施,数据不能轻易共享,各方面都存在大量重复。
仅将计算实例移动到 AWS ap-southeast-2
不可以,因为数据库或 redis 查询会受到往返时间的更大影响,所以不会起作用。
在 AWS ap-southeast-2 中有一个只读副本,并在 eu-central-1 中执行写入
比选项 2 更好,但会增加代码的复杂性,而且写入的次数通常也不是那么少。
在 AWS ap-southeast-2 中启动负载均衡器,并与 VPC 对等连接
想法:用户连接到 AU 端点,流量通过强大的连接传输到 EU 实例。但是,这显然不会缩短距离,我们不确定潜在的改进(如果有的话?)
有没有人遇到过类似的问题并愿意分享一些见解?
更新:似乎只有第一个 HTTPS 请求非常慢。在深入研究 AWS 负载均衡器选项时,我还注意到AWS 全球加速器可能会有帮助,所以我们做了一些测试。
从本地系统(在欧盟):
curl -w "dns_resolution: %{time_namelookup}, tcp_established: %{time_connect}, ssl_handshake_done: %{time_appconnect}, TTFB: %{time_starttransfer}\n" -o /dev/null -s "https://saas.example.com/ping" "https://saas.example.com/ping"
dns_resolution: 0,019074, tcp_established: 0,041330, ssl_handshake_done: 0,081763, TTFB: 0,103270
dns_resolution: 0,000071, tcp_established: 0,000075, ssl_handshake_done: 0,000075, TTFB: 0,017285
从 AU(EC2 实例):
curl -w "dns_resolution: %{time_namelookup}, tcp_established: %{time_connect}, ssl_handshake_done: %{time_appconnect}, TTFB: %{time_starttransfer}\n" -o /dev/null -s "https://saas.example.com/ping" "https://saas.example.com/ping"
dns_resolution: 0,004180, tcp_established: 0,288959, ssl_handshake_done: 0,867298, TTFB: 1,161823
dns_resolution: 0,000030, tcp_established: 0,000032, ssl_handshake_done: 0,000033, TTFB: 0,296621
从 AU 到 AWS Global Accelerator(EC2 实例):
curl -w "dns_resolution: %{time_namelookup}, tcp_established: %{time_connect}, ssl_handshake_done: %{time_appconnect}, TTFB: %{time_starttransfer}\n" -o /dev/null -s "https://saas-with-global-accelerator.example.com/ping" "https://saas-with-global-accelerator.example.com/ping"
dns_resolution: 0,004176, tcp_established: 0,004913, ssl_handshake_done: 0,869347, TTFB: 1,163484
dns_resolution: 0,000025, tcp_established: 0,000027, ssl_handshake_done: 0,000028, TTFB: 0,294524
简而言之:TLS 握手似乎造成了最大的初始延迟。但是,如果可以重复使用,AU 到 EU 的额外时间似乎实际上“仅”约为 277 毫秒(0.294524 秒 - 0.017285 秒)的首字节时间。
问候!