前言
之前有用户反馈我们的服务接口请求速度慢,比如一个请求从请求到响应用了 1.5s, 但是我通过 nginx 日志来看的话,这一条请求处理的时间只有 0.2s, 也就是 http 请求在往返途中其实消耗了 1.3s。 所以如果要优化接口速度的话, 其实就是优化请求线路。
加速线路的几种方式
通常我们经常用的有以下三种:
1. 静态资源的 CDN 加速
这个也是绝大部分网站经常用的,就是通过 CDN 的边缘节点,进行静态资源的缓存,然后优先走最近的节点,从而节省请求时间。 各大云厂商都有提供这种服务,比如 aws 的 cloudfront。
2. 动态 CDN 加速
所谓的动态内容加速,是指用户在请求一些动态内容时,如网站中的 .asp
、.jsp
、.php
和.cgi
接口、API
接口等,不直接请求源站,而是由基于地理位置的DNS调度,请求最靠近用户的云服务节点,再由云服务节点通过优化过的传输网络(公网,但比普通BGP更优化的链路),转发请求到源站,达到优化和加速的目的。当然这其中有很多其他的传输层面的优化,比如访问链路优化、传输内容压缩合并、智能选路、链路复用等技术。
很多云厂商都有这种服务,比如:
这三家的动态加速,其实都支持动静态内容混合加速,即静态内容直接由边缘节点(静态CDN)返回,动态请求走内网代理转发到源站。AWS更是把动静态加速直接合并为一个服务 Amazon CloudFront,统一计费。 像我们的产品,接口服务器都在海外,国内直接访问接口的话,会比较慢,所以就有启用腾讯云的动态 CDN 加速的服务, 用了之后,确实快了很多。
3. 把长距离公网传输改为自建的内网传输
这种通常叫全球加速, 就是在全球各个点进行布点,比如自己拉海底电缆之类的, 从而在自己的内网传输中大大的加快速度。 用一张图来说明就很清晰了:
而我们今天要讲的 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 这台服务器的情况如下:
可以看到除了美区连美区之外,其他区(欧洲,南美,中国,日本) ping 都要 110-172 ms 。 接下来将这一台服务器添加 GA 服务,然后再测试一下:
可以看到 ping 的时间直接变成 1-7 ms, 这个就变得非常快了。 所以可以看到加了 GA 服务之后,确实从各个区到这一台服务器的线路优化了很多。
官网提供的 web 测试工具
他有提供了一个测试站点的工具 https://speedtest.globalaccelerator.aws/#/
试了一下,看起来效果挺明显的。 但是他这个工具只有浏览器版本, 没办法在我们的 云服务器 上测试。
从业务上来测试
正常的接口业务,肯定是会涉及很多比较复杂的操作,比如 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 |
测试总结
- 中国区直连确实会比 腾讯云加速 和 ga 加速来的慢 (加速后快了三分之一到二分之一), 腾讯云加速又比 ga 加速来的快。
- 美区的话,分为美东和美西, 美西的话,加速和没有加速几乎看不出差别 (库都在美西), 但是美东的话, 在 api 4 直连的耗时会比 ga 耗时高很多 ( 3s -> 0.5s)
- 欧洲的话,整体速度也有提高,大概提升了 10%-20%
- 日本地区的话,整体速度也有提高,大概提升了 10%-20%
- 南美的话,整体优化特别明显, 速度快的接口也有提升 10%-20%, 速度慢的接口甚至可以提升好几倍
- 而且可以看到加了 ga 之后,整体速度非常稳定,不管是访问数据库还是 redis, 基本整个接口的请求时间都会在 1s 以内, 几乎不受网络波动
测试 GA 的方式很简单,可以在云服务器上 host GA 的静态 ip 就行了。 然后请求域名不变
AWS Global Accelerator 收费情况
具体收费标准请看: AWS Global Accelerator 定价
GA 的收费包含两部分:
固定费用,按时间来收费, 按账号来算, 每小时(不足 1 小时按 1 小时算)收取 0.025 USD,直到加速器被删除, 也就是说,我们一旦开启了这个服务器,不管有没有流量,一个月就要花费 30 24 0.025 = 18 美金。 这个钱不会很多
按流量收费,通过 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 | 您在北美洲 AWS 区域部署的应用程序中运行一台加速器。 |
而且不同地区的出站流量的价钱是不一样的,具体可以看这张图:
具体创建实操
创建其实很简单, GA 支持 负载均衡的方式, 也支持单台 EC2 的方式, 注意, 只有 aws 的云服务器才能启用 GA 服务。
1. 创建一个加速器
按照步骤一步一步处理即可,比如我选择的是针对 ELB 负载均衡设置的, 就可以选择这个负载均衡所在的区就行了。
好了之后,就可以看到你创建的 GA 加速器了。
这样就创建好了
2. router 53 换成 GA 的 DNS 域名
最后要生效,只要将这个服务的域名指向这个 GA 加速器的 DNS 域名或者对应的静态 ip 就行了。
参考资料: