如何测试驱动内容交付网络

如何不破坏互联网。

介绍

内容交付网络(CDN)是位于您的网站和用户之间的缓存。

当您的网站变得流行并且您不想继续扩大您的网络服务器来处理负载时,这很有用。 这样可以避免由于负载过大导致网站故障的“中断互联网”时刻。 我的侄女收到了一件礼物,里面有一件invisibility cloak的圣诞节礼物,需要一个应用程序才能使其正常工作。 该网站无法处理圣诞节早晨激活的大部分已售产品的负载。 可以谨慎使用CDN(其他技术)来避免令人尴尬的错误。

CDN是大量提高网站性能的好方法。

您的网站是此图中的来源。

默认情况下,它将开始缓存每个请求。 一旦开始向页面添加缓存头,就可以控制CDN缓存页面的方式。 您将不希望缓存网站的某些部分。 通过定义的路径结构将它们分开,以使您的生活更轻松( /api前缀在此效果很好)。

这样做的好处是,CDN能够比您更快地向您的用户提供内容,因为他们离他们更近。 从欧洲致电到美国可能需要100毫秒的时间。 这将产生重大变化。

此外,您网站上的大部分负载都将被删除(唯一的访问者是具有过期缓存的CDN节点)。 如果该站点是静态站点,并且缓存已预热(访问了每个页面),则可以短暂关闭原始站点,然后仍然可以启动该站点。 这样就可以部署负载很重的站点。

另一个好处是您可以将CDN设置为提供过时的内容。 这意味着如果缓存的页面随后开始失败,则服务器将返回先前的缓存版本。 这将大大提高您网站的可靠性。

尽管该网站由单个heroku节点提供服务,但我工作的一个网站仍然能够处理繁重的工作(Google Analytics(分析)上数以万计的并发会话)。 该站点能够在大约一秒钟内发布更新。 我们明确管理了需要缓存的内容,将更新应用到我们的站点,然后告诉CDN使更改的页面无效。

通常,CDN可使您承受短暂的沉重负载,并且仅收取少量额外使用费用,这比继续扩大服务器成本要便宜得多。

有几种CDN可供使用,我最熟悉的一种是Fastly。 快速是Varnish缓存的分布式版本。 清漆缓存可作为docker映像运行。 这意味着可以试驾您的CDN!

我将演示如何配置Express Web服务器以通过Varnish在一组Docker映像中进行缓存。 这将允许编写测试以证明缓存在按预期部署之前可以正常工作。

怎么样

我已经写了一些示例代码,可以在这里找到:

样例代码

它由一个简单的快速应用程序组成,该应用程序正在docker容器中运行。 Docker Compose用于创建链接的docker映像。

可以使用以下命令开始:

docker-compose build && docker-compose up

原始应用程序在端口3000上公开

缓存的应用程序在端口5000上公开

这是已缓存的端点:

curl -v localhost:5000/now

退货

*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 5000 (#0)
> GET /now HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.64.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Content-Type: text/html; charset=utf-8
< Content-Length: 13
< ETag: W/"d-ALnVQnzapyFibAJUsj/ugNkTGeo"
< Date: Tue, 31 Dec 2019 08:54:54 GMT
< X-Varnish: 32775
< Age: 0
< Via: 1.1 varnish-v4
< Accept-Ranges: bytes
< Connection: keep-alive
< 
* Connection #0 to host localhost left intact
1577782494578* Closing connection 0

重复调用将返回相同的结果:

curl -v localhost:5000/now
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 5000 (#0)
> GET /now HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.64.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Content-Type: text/html; charset=utf-8
< Content-Length: 13
< ETag: W/"d-ALnVQnzapyFibAJUsj/ugNkTGeo"
< Date: Tue, 31 Dec 2019 08:54:54 GMT
< X-Varnish: 32778 32776
< Age: 39
< Via: 1.1 varnish-v4
< Accept-Ranges: bytes
< Connection: keep-alive
< 
* Connection #0 to host localhost left intact
1577782494578* Closing connection 0

请注意,身体相同,但已报告了年龄。

此版本具有缓存头,将不会被缓存:

curl -v localhost:5000/now-nocache
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 5000 (#0)
> GET /now-nocache HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.64.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Cache-control: private, max-age=0, no-cache
< Content-Type: text/html; charset=utf-8
< Content-Length: 13
< ETag: W/"d-rBzErqEgrVIYGMP1QHJVW2pE10k"
< Date: Tue, 31 Dec 2019 08:56:38 GMT
< X-Varnish: 32780
< Age: 0
< Via: 1.1 varnish-v4
< Accept-Ranges: bytes
< Connection: keep-alive
< 
* Connection #0 to host localhost left intact
1577782598029* Closing connection 0

重复通话会得到:

*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 5000 (#0)
> GET /now-nocache HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.64.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Cache-control: private, max-age=0, no-cache
< Content-Type: text/html; charset=utf-8
< Content-Length: 13
< ETag: W/"d-FVW0D0z387XypqaGgxU3K6yNXX4"
< Date: Tue, 31 Dec 2019 08:57:19 GMT
< X-Varnish: 6
< Age: 0
< Via: 1.1 varnish-v4
< Accept-Ranges: bytes
< Connection: keep-alive
< 
* Connection #0 to host localhost left intact
1577782639781* Closing connection 0

这演示了如何在Docker容器中测试CDN。 如果您想更好地控制配置,这将变得更加有用。 Varnish使用Varnish配置语言: Varnish文档进行配置 –可以完全控制网站的行为。

例如,您可以检查cookie并根据值返回不同的页面(登录的用户获得一个,未经身份验证的用户获得另一个)。

可以有条件地添加标头(这样,起源,而public仅在发送正确的标头时才响应)。 这使开发人员可以检查来源是否健康–这将使问题隔离更加容易。

您还可以更改响应,以便屏蔽有关该应用程序的详细信息。 令人惊讶的是,有多少网站公布了他们正在使用的Web服务器的确切版本。 只需使用curl即可看到: curl -v bbc.co.uk

您可以使用CDN来更改托管网站的行为,而无需更改托管网站本身。 这可以让您在准备真正的解决方案时快速解决问题。 例如,您可以为特定的URL放置一个保留页面。

建议不要告诉CDN永远缓存,因为任何错误都可能无限期地存在于浏览器中-如果您正在缓存Javacript库并意外地缓存了损坏的版本,则可能会出现问题。

我还建议以编程方式配置CDN,以使其可测试且可重复。 请小心CDN的工作量,因为您会遇到奇怪的情况,例如缓存错误页面。

确保您知道如何清除特定页面。 我工作的网站将其添加到闲聊的聊天机器人中。 它能够通过发送松弛消息来清除页面-当您必须支持问题并且远离计算机时,这是理想的选择。

可以将AWS S3用作缓存,但建议在其前面添加CDN,以便您可以控制返回的标头。

准备样品时要学习。

与完整胖版本相比,高山docker映像启动和下载速度相当快。 这些是非常小的docker映像

测试需要等待清漆服务器启动。 通常,我会使用wait-for-it.sh脚本,该脚本允许等待给定服务的完成。 但是,由于我使用的是高山docker容器,因此我们没有bash可用。 这意味着我已经使用了golang waitforit实用程序。

还要注意docker-compose中使用的各种网络选项。 如果在depends_on部分中列出,则可以将另一个docker容器名称的别名用作本地dns条目。 甚至可以访问容器内运行的测试。

那其他CDN呢

现在,如果您真的想测试现实生活中的CDN,可以使用以下项目: wiremock heroku示例

这使您可以将Wiremock部署到Heroku中。

如果您将CDN配置为将此Heroku应用作为原始源使用,则可以完全测试CDN的行为。 Wiremock为您提供了一个可编程的Web服务器,并为您提供了一个允许更改响应的API,因此有可能使页面一次返回一个固定值,然后开始返回错误。 如果您希望这样做,它可以让您测试整个HTTP规范,但这超出了本文的范围。

CDN通常由组织内的基础结构团队控制。 允许对配置进行测试驱动将使您能够使用CDN的更多高级功能。

翻译自: https://www.javacodegeeks.com/2020/01/how-to-test-drive-a-content-delivery-network.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值