不到3000块钱,如何支撑起每月500万次访问量及80TB流量的网站?

来源:CSDN博客 | 2022-05-07 14:01:24 |

长期以来,我们一直面临一个核心挑战:如何有效利用非常有限的捐赠资金,顺利运营一个高人气的网站及其静态资源。

将一堆文件直接扔到亚马逊的S3上当然非常容易,但我们根本承担不起如此高昂的费用。

单是利用 S3 提供 80TB 的流量,每月就需要花费4千美元,恰巧我们获得的捐赠资金大概也是这个数目。

就这一项,我们的预算就花了个干净,更不用说其他成本了。

那么,我们是如何以不到区区 400 美元的成本,支撑起每月拥有 500 万次访问量及 80TB 流量的网站呢?

Cloudflare

为了通过经济实惠的渠道,轻松地支撑起我们的网站,我们找到了Cloudflare。如果没有这个网络巨头,那么我们这一路会更加艰辛。

对我们来说,Cloudflare是一个巨大的缓存层。

这是什么意思?举个例子,当伦敦的某人下载某个文件时,客户端需要从我们的服务器获取文件,而 Cloudflare 可以将这个文件缓存到最近的一个边缘节点。

下一次,当伦敦有人下载同一个文件时,Cloudflare 就可以将缓存的文件直接提供给他们,这样就不需要访问我们的源服务器了。

我们通过一组规则,定义了某些特定文件以及URL的缓存时间,如果是很少发生变更的文件,则可以长时间缓存,而对于每天都会变化的文件(例如我们的静态文件列表 ) ,则需要频繁更新。

就静态文件下载而言,大约 85% 的流量都可以由缓存提供。

这种方法不仅适用于文件下载,而且还可用于网站的一切。

每页加载页面时,浏览器会发送几十个请求,比如样式表、javascript、json 数据等等,但大多数都是静态文件。

Cloudflare 同样可以缓存这种流量,效果甚至比巨大的静态文件更好,最终的缓存率达到了 93%。

这极大地减轻了源服务器的压力,而相应的成本也会下降。

那么,这个强大的缓存层的成本又是多少呢?

每个月 40 美元。

Cloudflare 的高级会员费用为每个域 20 美元,我们有两个域:polyhaven.com,用于运营主网站;polyhaven.org,用于静态文件下载。

Backblaze 的带宽联盟

在 Cloudflare 的帮助下,我们需要处理的流量已由原来的 80TB 降到了 15%。尽管如此,如果使用亚马逊 S3 服务的话,每月还是需要支出约 650 美元。

然而,S3 不是该领域唯一的玩家,还有很多其他更划算的提供商。

而我们的选择是 Backblaze,这也是一家为消费者提供备份服务的互联网巨头。

如果直接使用 Backblaze 的 B2 服务(亚马逊 S3 的同等服务),对于 Cloudflare 无法处理的最后 15% 的服务,每月将花费 130 美元。

但是,由于 Backblaze 和 Cloudflare 之间的合作关系,我们可以享用他们的“带宽联盟”。

只要我们同时使用这两种服务,并支付 20 美元的 Cloudflare 订阅费用,就完全不需要为下载流量付费。

也就是说,我们只需要支付存储费、部分上传费用和 API 请求,最后统计下来每个月大约 11 美元。

Web “服务器”

通过上述一连串的操作,我们终于解决了托管静态文件本身的所有成本,但我们还需要一个网站来展示这些信息。

我们的网站 polyhaven.com 是用 Next.js 构建的( Next.js是一个 javascript 框架,由 Vercel 创建。

虽然我们可以在自己的服务器或其他云提供商上运行 Next.js 应用程序,但 Vercel 提供了一项非常简洁的服务,而且价格合理,我们可以使用这项服务部署 Web 应用程序。

这不仅可以省去管理服务器的麻烦,而且无服务器的环境还有其他好处,比如提高世界各地用户的性能。

他们的基本费用是每月 20 美元,并根据使用情况收取额外费用。

由于我们已经使用了 Cloudflare,而且非常清楚哪些可以缓存,而哪些不行(比如需要用户身份验证的地方),所以一般我们都不会超出使用限制,除非出现严重错误。  

事实上,最近我们获得了 Vercel  的赞助,所以我们无需承担任何费用。但本文仍然会将这笔费用计算在内。

数据库

数据库是网站的重要组成部分,其中存储了每个静态文件的所有信息、文件列表、下载日志等。

以前,我们选择单独运行 hdrihaven.com 和其他站点,所有站点都建立在需要手动管理的 LAMP 技术栈上,性能问题的高发环节往往就是数据库。

为了避免将来出现这个问题,同时也不必再担心可靠性、性能、可扩展性以及完整性等问题,我们决定购买商业云解决方案:Google Firestore。

当然,这不是最便宜的选择,每月大约需要 100 美元,约占我们的网络预算的一半,但我仍然认为这是正确的选择。

Firestore 只收取超出免费使用的部分。对我们来说,主要是读取数据库。 

每次从数据库中获取数据,我们都需要支付少量费用。其实,每次读取的成本非常小,大约为 0.0000006 美元。但是乘以每次页面浏览必须读取的文档数量(比如我们的库页面,每个静态文件都需要读取一次数据库,目前共计为 866 次),再乘以页面的浏览次数(每月约 500 万次),相应的成本会非常高昂。

为了尽可能避免读取数据库,我们需要尽可能地缓存数据。实际上,我们的数据变化频率并不高,而且还有一些不太重要的数据,即使发生变化也不需要向用户显示最新信息(例如下载次数),所以使用 Cloudflare 就足够了。

我们的 API

为了最大程度地缓存数据库的读取,并避免 Vercel 的账单金额上涨,我们花费了 5 美元,单独搭建了一个服务器运行 API。

这个 API 的目标是将前端网站(托管在 Vercel 上)连接到我们的数据库。由于大量数据都被缓存了下来(为了降低数据库成本),因此这个 API 服务器可以说非常简单。 

在未来很长一段时间内,这台服务器都可以支撑我们的需求,如果真到了无法支撑的那一天,我们也可以轻松地将服务器快照迁移到更强大的服务器,或者迁移到带有负载均衡的服务器网络中。

Argo

我们的数据库和 API 的成本如此之低(相对于不使用 Cloudflare 的成本),主要原因之一是缓存率极高,可达93%。

Cloudflare 的缓存越多,我们的 API 从数据库读取数据的频率就越低,相应地成本也就越低。

Argo 是 Cloudflare 的一项可选服务,主要功能有两个:

1. 优化 DNS 路由,以改善延迟(有助于提升网站的速度)。

2. 向缓存添加一个额外的层,这样所有流量都会流经 Cloudflare 的几个最大的数据中心,再分散到数百个边缘节点。

我们对第二个功能非常感兴趣。

继续拿上面的例子说明,如果使用 Argo,伦敦的某人下载了一个文件,则 Cloudflare 缓存的文件不仅可供伦敦使用,而且可供整个西欧使用。

这可以提高缓存率(从75%上升至93%),但需要付出代价:经由 Argo 网络的每 GB 流量都需要付费。

这就是为什么我们分别建立了两个域的原因:我们的 .com 域启用了 Argo,因为该网站所需的带宽较低;而 .org 域则禁用了 Argo,因为它需要服务的下载流量高达 80 TB。

目前,Argo 每月的费用大约为 160 美元,是迄今为止最大的单笔费用。但请记住,它为我们节省了一大笔数据库费用,我大概算了一下,节省的成本大约为 250 美元。 

此外,我们还可以享受降低延迟、降低 API 服务器负载以及减少 Vercel 的使用等优势。

图像托管

最后,我们还需要考虑图像的问题。我们的网站上显示的所有图像(缩略图、渲染、预览等)都存储在 Bunny.net,这又是一笔 CDN 费用。

Bunny.net 不仅可以存储图像,而且他们还提供优化服务,允许我们动态调整网站的图像大小并动态压缩图像。这极大地改善了用户体验(页面的加载速度更快),以及我们的工作流程(我们只需要上传一个 PNG,而且格式和大小任意)。

根据流量大小,我们每月需要支付大约 27 美元的费用。

总成本

● DNS、缓存和出口:Cloudflare(2 个域),40 美元;

● 缓存:Cloudflare (Argo) ,160 美元;

● 静态文件存储:Backblaze B2,11 美元;

● 服务器托管:Vercel,20 美元;

● 数据库:Firestore,100 美元;

● API:Vultr,5 美元;

● 图片托管和优化:Bunny.net,27 美元;

● 域:Cloudflare,4 美元;

● 电子邮件费用:MXroute,3 美元。

总成本约 370 美元。

其中很多服务的收费都取决于实际的使用量,而实际的使用量又取决于网站的流量。这些成本可能会随着业务的发展而增长。

未来的打算以及突发事件的应对

我们在构建基础设施时,特别注意模块化,因此我们不会过分依赖任何服务。如果有必要的话,甚至连 Cloudflare 也可以换掉。

目前,我们最薄弱的单点故障是 API 服务器,而且我没有任何运行公共 API 的经验。我们希望允许其他人使用我们的 API,并将我们的静态文件集成到他们的软件,因此这个领域需要进一步的研究和改进。

Google Firebase 很方便,但是很贵。我们希望将来研究一些其他的托管数据库。

Cloudflare + Backblaze 的带宽联盟是我们最大的节约成本的利器。如果将来失去这个优势,我们的计划是建立自己的负载均衡专用服务器网络。虽然听起来很困难,但我们有过这样的经验,而且效果很好。虽然需要在管理上花费一番心思,但成本应该不高。

希望本文分享的经验能对你有所启发,也希望你能找到理想的架构。

原文地址:https://blog.polyhaven.com/how-we-handle-80tb-and-5m-page-views-a-month-for-under-400/

本文为 CSDN 翻译,未经授权禁止转载!

关键词: