使用 AWS Global Accelerator 加速你的服务

前言

之前有用户反馈我们的服务接口请求速度慢,比如一个请求从请求到响应用了 1.5s, 但是我通过 nginx 日志来看的话,这一条请求处理的时间只有 0.2s, 也就是 http 请求在往返途中其实消耗了 1.3s。 所以如果要优化接口速度的话, 其实就是优化请求线路。

加速线路的几种方式

通常我们经常用的有以下三种:

1. 静态资源的 CDN 加速

这个也是绝大部分网站经常用的,就是通过 CDN 的边缘节点,进行静态资源的缓存,然后优先走最近的节点,从而节省请求时间。 各大云厂商都有提供这种服务,比如 aws 的 cloudfront。

2. 动态 CDN 加速

所谓的动态内容加速,是指用户在请求一些动态内容时,如网站中的 .asp.jsp.php.cgi接口、API接口等,不直接请求源站,而是由基于地理位置的DNS调度,请求最靠近用户的云服务节点,再由云服务节点通过优化过的传输网络(公网,但比普通BGP更优化的链路),转发请求到源站,达到优化和加速的目的。当然这其中有很多其他的传输层面的优化,比如访问链路优化、传输内容压缩合并、智能选路、链路复用等技术。

很多云厂商都有这种服务,比如:

1

这三家的动态加速,其实都支持动静态内容混合加速,即静态内容直接由边缘节点(静态CDN)返回,动态请求走内网代理转发到源站。AWS更是把动静态加速直接合并为一个服务 Amazon CloudFront,统一计费。 像我们的产品,接口服务器都在海外,国内直接访问接口的话,会比较慢,所以就有启用腾讯云的动态 CDN 加速的服务, 用了之后,确实快了很多。

3. 把长距离公网传输改为自建的内网传输

这种通常叫全球加速, 就是在全球各个点进行布点,比如自己拉海底电缆之类的, 从而在自己的内网传输中大大的加快速度。 用一张图来说明就很清晰了:

1

而我们今天要讲的 AWS Global Accelerator 这个服务就是第三种加速类型。

AWS Global Accelerator

套用他们官网的话,就是:

AWS Global Accelerator 是一种服务,可以提高您的本地或全球用户获得的应用程序的可用性和性能。
它提供静态 IP 地址,充当您在单个或多个 AWS 区域中的应用程序终端节点(例如,您的 Application Load Balancers、网络负载均衡器或 Amazon EC2 实例)的固定入口点。

AWS Global Accelerator 使用 AWS 全球网络优化您的用户访问应用程序的路径,将您的流量性能提高多达 60%。
您可以从自己的位置使用速度比较工具测试性能优势。
AWS Global Accelerator 持续地监控应用程序终端节点的运行状况,并在 30 秒内将流量重定向到运行正常的终端节点。

他有挺多功能,但是对我们来说,他可以加速延迟敏感的应用程序这个功能就是我们要的。Global Accelerator 并不像 CDN 通过边缘节点提升访问速度,他只是类似提供了一条 aws 专线, 使用自己的aws 主干网,通过专用线路到我们服务器。通过主干网线路的优化,从而来减少网络延迟和抖动,最后达到提高请求速度的表现。

简单测试连通性

为了测试一下 GA 服务是否真的可以达到优化线路的情况,我们进行了以下测试: 以美区的某一个服务器为例,其他区去 ping 这台服务器的情况如下:

1

可以看到除了美区连美区之外,其他区(欧洲,南美,中国,日本) ping 都要 110-172 ms 。 接下来将这一台服务器添加 GA 服务,然后再测试一下:

1

可以看到 ping 的时间直接变成 1-7 ms, 这个就变得非常快了。 所以可以看到加了 GA 服务之后,确实从各个区到这一台服务器的线路优化了很多。

官网提供的 web 测试工具

他有提供了一个测试站点的工具 https://speedtest.globalaccelerator.aws/#/

1

试了一下,看起来效果挺明显的。 但是他这个工具只有浏览器版本, 没办法在我们的 云服务器 上测试。

从业务上来测试

正常的接口业务,肯定是会涉及很多比较复杂的操作,比如 IO, 读取数据库, 远程调用之类的, 所以最后还得落实到具体的业务接口上来测试, 才能正常是否有用。

通过 nginx 的这个命令,我们可以得到一个接口请求的时间: time_total

1
curl -o /dev/null -s -w %{http_code}:%{http_connect}:%{content_type}:%{time_namelookup}:%{time_redirect}:%{time_pretransfer}:%{time_connect}:%{time_starttransfer}:%{time_total}:%{speed_download} http://www.xxx.com

然后再根据自己的场景去添加参数和其他头部。

分别在各个区域服务器上请求以下表格中服务的接口(直连请求5次取平均值,GA 加速请求5次取平均值), 最后得到的结果如下 (次数会偏少,但是一定程度上可以体现出来), 单位秒:

服务 业务接口 cn(中国区) us-west(美西) us-east(美东) eu(欧洲) jp(日本) sa(南美)
api 1 访问数据库,有多个查询和入库操作 直连:1.591
—-
腾讯云加速:0.704

ga : 0.907
直连:0.380

ga :0.289
直连:0.595

ga : 0.605
直连:0.983

ga : 0.783
直连: 0.989

ga : 0.869
直连:6.532

ga :0.873
api 2 访问数据库,有入库操作 直连:0.907

ga : 0.907
直连:0.149

ga :0.150
直连:0.521

ga :0.361
直连:0.822

ga :0.645
直连: 0.8426

ga : 0.7224
直连:6.37

ga : 0.732
api 3 访问数据库,有入库操作 直连:1.021

ga : 0.762
直连:0.146

ga : 0.141
直连:0.467

ga :0.415
直连:0.798

ga : 0.619
直连:0.817

ga : 0.713
直连: 0.875

ga : 0.717
api 4 需要远程调用另一个服务 和 查询 redis 腾讯云加速:0.669

ga :0.924
直连:0.339

ga : 0.323
直连:3.089

ga :0.537
直连:1.024

ga :0.808
直连: 0.986

ga :0.885
直连:1.072

ga : 0.895

测试总结

  1. 中国区直连确实会比 腾讯云加速 和 ga 加速来的慢 (加速后快了三分之一到二分之一), 腾讯云加速又比 ga 加速来的快。
  2. 美区的话,分为美东和美西, 美西的话,加速和没有加速几乎看不出差别 (库都在美西), 但是美东的话, 在 api 4 直连的耗时会比 ga 耗时高很多 ( 3s -> 0.5s)
  3. 欧洲的话,整体速度也有提高,大概提升了 10%-20%
  4. 日本地区的话,整体速度也有提高,大概提升了 10%-20%
  5. 南美的话,整体优化特别明显, 速度快的接口也有提升 10%-20%, 速度慢的接口甚至可以提升好几倍
  6. 而且可以看到加了 ga 之后,整体速度非常稳定,不管是访问数据库还是 redis, 基本整个接口的请求时间都会在 1s 以内, 几乎不受网络波动

测试 GA 的方式很简单,可以在云服务器上 host GA 的静态 ip 就行了。 然后请求域名不变

AWS Global Accelerator 收费情况

具体收费标准请看: AWS Global Accelerator 定价

GA 的收费包含两部分:

  1. 固定费用,按时间来收费, 按账号来算, 每小时(不足 1 小时按 1 小时算)收取 0.025 USD,直到加速器被删除, 也就是说,我们一旦开启了这个服务器,不管有没有流量,一个月就要花费 30 24 0.025 = 18 美金。 这个钱不会很多

  2. 按流量收费,通过 AWS 网络传输的数据的每 GB 费率。DT-Premium 费率取决于处理请求的 AWS 区域(源)和响应定向到的 AWS 边缘站点(目标)。您只需为主方向传输的数据支付 DT-Premium。AWS Global Accelerator 的 DT-Premium 费用适用于流经 AWS Global Accelerator 的所有流量,无论目标是否指向 Internet、其他 AWS 区域还是可用区。除了对在 AWS 区域中运行的应用程序终端节点收取正常的 EC2 数据传出费用之外,还会收取 DT-Premium 费用。 (也就是说除了原有的 EC2 的出站流量之外, 经过 GA 服务的流量还要额外算, 所以有些流量要算两次钱)

当然一样只算出站流量 (即下载流量), 如果是入站流量 (上传流量) 是不用算钱的。 举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
您在北美洲 AWS 区域部署的应用程序中运行一台加速器。

每月固定费用

假设加速器每月 30 天每天运行 24 小时,则您每月需要为该加速器支付 18 USD 的固定费用。

每月 DT-Premium 费用

假设每月使用加速器通过 AWS 网络传输的流量是 10000GB,其中 60% 是从应用程序传输到互联网上的用户的出站流量,
剩余 40% 是从互联网上的用户传输到 AWS 区域中应用程序的入站流量。您只需按小时为传输到用户的出站流量付费,因为这是主方向流量。
因此,您每月只需为 6000GB 而不是 10000GB 流量付费。

每月 6000GB 流量按如下方式分布:

5000GB 从北美洲 AWS 区域传输到欧洲 AWS 边缘站点。对于这类流量,您每月需要支付 75 USD (0.015 USD/GB)。
1000GB 从北美洲 AWS 区域传输到亚太地区 AWS 边缘站点。对于这类流量,您每月需要支付 35 USD (0.035 USD/GB)。
每月 DT-Premium 费用是 110 USD,加上每月 18 USD 固定费用,则 AWS Global Accelerator 每月总费用是 128 USD。

而且不同地区的出站流量的价钱是不一样的,具体可以看这张图:

png

具体创建实操

创建其实很简单, GA 支持 负载均衡的方式, 也支持单台 EC2 的方式, 注意, 只有 aws 的云服务器才能启用 GA 服务。

1. 创建一个加速器

按照步骤一步一步处理即可,比如我选择的是针对 ELB 负载均衡设置的, 就可以选择这个负载均衡所在的区就行了。

png

好了之后,就可以看到你创建的 GA 加速器了。

png

这样就创建好了

2. router 53 换成 GA 的 DNS 域名

最后要生效,只要将这个服务的域名指向这个 GA 加速器的 DNS 域名或者对应的静态 ip 就行了。


参考资料: