注意:以下所有的图片和状态来自写文档时,随时间会发生改变。
Poly Haven 的一个核心挑战是仅靠捐赠维护一个非常受欢迎网站和资源。
仅仅把一堆文件丢到 Amazon S3 是很容易的,但是你会欠下支付不起的账单。
用 S3 提供 80TB 的带宽大约需要 4000美元/月,刚好是现在 Patreon 上的捐赠金额。
这显然是不合理的,没有预算干别的事了。
那么我们是怎么用 400 美元支撑 80TB 和 5M PV 呢。
这个巨头可能是我们容易做这件事的原因,当然没有它也能做,需要做些额外的事。
Cloudflare 对我们来说是一个巨大的缓存层
什么意思?举个栗子,当某人在伦敦下载一个文件,这个文件从我们的原始服务器获取(稍后详细说)但是一定会通过一个附近的 Cloudflare 节点
然后,接下来某人从伦敦下载相同的文件,Cloudflare 已经缓存它,直接返回给用户,不需要再从原始服务器获取。
我们用一套规则定义一个文件或者 URL 需要缓存多长时间,这样保证很少更新的文件尽可能长的缓存,每天变化的内容更新的更加频繁
对于资产下载,这些缓存下载占了总流量的 85%

缓存(橘色) vs 非缓存
缓存不仅仅应用在文件下载,网站的一切都有应用
每次加载页面,浏览器发送几个事请求 (stylesheets, javascript, json data…) 大多数是静态的。

因为 Argo (后文详说) Cloudflare 能做的比文件下载更好,超过 93% 的流量被缓存。

polyhaven.com 的流量 (除了资产文件和图片请求)
这些缓存让原始服务器要做的工作少的多,意味着理论上更实惠。
那么这些迷人的缓存层花费多少?
40美元/月
Cloudflare Pro 会员一个域名 20美元,我们有两个域名:主站 polyhaven.com 和 下载站 polyhaven.org
用了 Cloudflare 之后,我们只需要处理 12TB (80 * 15%) 贷款,还是很贵,S3 大概要 650美元/月
S3 不是游戏里的唯一玩家,还有其他预算友好的云提供商。
我们用 Blckblaze,另一个互联网巨头,以消费者备份服务出名。
Backblaze 处理 12Tb 带宽需要 130每月/月
但是,Backblaze 和 Cloudflare 有合作,叫做宽带联盟
只要我们两个服务都用,支付 20美元的订阅费,就不需要为下载流量额外付费。
我们需要支付的费用是:存储费用,上传和 API 费用,大约 11美元/月。

Web “Server”
到目前为止,我们覆盖了所有托管资产文件的成本,但是我们需要网站来展示他们
polyhaven.com 用 Next.js 构建,Next.js 由 Vercel 创建,一个 javascript 框架。
我们可以部署 Next.js 应用到自己的服务器或者云提供商,但是 Vercel 提供一种简单和廉价的方式直接部署 web 应用。
这省去了我们管理服务器麻烦,同事还具有 serverless 的好处,为全世界的用户提供更好的性能。
他们的基本费用是 20美元/月,根据使用额外收费。
我们在使用 Vercel 之前用了 Cloudflare 而且非常小心的区分哪些可以缓存,哪些不可以(比如用户认证),我们通常不会超过使用限制,除非出现重大问题。

Vercel serverless 函数执行时间(免费使用 1000小时)
实际上,最近我们获得了 Vercel 的赞助,它们现在承担我们的成本,但是在本文中我们假装支付给它
The Database
这无疑是内容网站重要的组成部分,存储所有的资产信息,文件列表,下载日志等。
当我们还在运营 hdrihaven.com 和其他网站时,我们手动管理 LAMP 技术栈,数据库是第一个遭受性能问题的。
为了避免将来出问题,我决定花点钱寻找一个云解决方案,这样我不用担心可靠性,性能,扩展性和完整性,我们选了 Google Firestore。
这当然不是最便宜的选择,100美元/月占了我们一半的 web 预算,但是我依然认为他是正确的选择。

Firestore 每天使用统计
使用 Firestore 除了免费层,你还需要按使用付费。对于我们主要是数据库读操作(上图的蓝线)
每次从数据库读取 1bit 我们需要支付一丁点钱。每次读操作几乎微不足道,大约 0.0000006美元。但是乘以每个 PV 的文档读取数(比如 library page 一个资产一个读,目前是 866)再乘以 PV 数(500万/月)很快就变得非常昂贵。
为了避免尽可能多的读操作,我们尽可能多的缓存。我们的数据不怎变,实时性要求不高,用户看到旧的缓存数据也可以。Cloudflare 到处都用。
为了最大程度控制数据库读取缓存,同时避免在 Vercel 花费太多,我们在 Vultr 上有一个单独的5 美元/月服务器(是的,没听错)运行我们的 API
这个 API 的目的是链接我们的前端网站(在 Vercel 上)到我们的数据库。这就是它做的全部。
因为我们做了大量缓存(为了减少数据库花费)所以 API 服务器可以非常基础。

API 服务器状态
这台服务器还能撑挺长时间,而且万一它撑不住了只要把快照迁移到一个强一点服务器就好,或者用负载均衡,都非常容易。
数据和 API 花费少的一个主要理由是极端高的缓存率 93%。
这是主要影响:Cloudflare 缓存越多,数据库和 API 使用越少,花费也就越低。
Argo 是 Cloudflare 的可选服务,它做两件事
这 2 点是我们关心的
使用我们前面的例子:如果加了 Argo,如果在伦敦的用户第一次下载一个文件,Cloudflare 不仅仅为伦敦缓存文件,还会为整个西欧缓存。
这大大提高缓存率(从 75% 提高到 93%)但是需要额外付费:你现在需要按通过 Argo 网络的流量,按照 GB 付费

这就是为什么我们分了 .com 和 .org 两个域名。在 .com 域名上我们启用 Argo 以减少宽带,.org 域名禁用 Argo 毕竟有 80TB 的下载流量。
目前 Argo 花费我们 160美元/月,目前为止最大的一笔支出。但是记住它为我们节省了一大笔数据库使用费,我粗略估计 250美元/月。
此外,我们减少延迟,减少 API 服务器负载,也减少 Vercel 使用。

最后一块拼图独立于其他部分。
我们所有网站上展示的图片(缩略图,渲染,预览等)都保存在 Bunny.net 另一个 CDN
Bunny.net 不仅存储我们的图片,它还有一个优化服务允许我们动态调整、压缩图片。这极大的提高用户体验(页面加载更快)和我们的工作流(我们只需要上传一个 PNG 就可以使用任何大小和格式)
这些花费我们 27美元/月,根据流量确定

总计 370美元
大多数费用和服务使用量有关,直接收到网站流量的影响。
随着我们的成长,这些费用可能会增加,这是好事。如果你在遥远的未来阅读这篇文章,看看我们的费用报告,看看那些事情变化了。
对了,报告里的 Web Hosting 这一项可能会有点高 370美元,这是因为它包含一些其他服务器,不是严格用于运营 polyhaven.com。
我们的基础建设有意的模块化,这样我们不会特别重的依赖某个服务。甚至 Cloudflare 都能被替代。
我们的 API 是现在最弱的单点故障 - 我对运营公共 API 没有经验。我们想允许其他人根据我们的 API 集成我们的自粘到他们的软件,这块需要研究和提高。
Google Firebase 很好很遍历,但是太贵了。我们可以在将来调研一些其他数据库管理选项
我们最大的花费节省来自 Cloudflare + Backblaze 宽带联盟。我们的计划师,如果这个方案在将来不存在,那么我们就建立自己的负载均衡服务器来处理这些流量。这听起来很可怕,但是我们在过去确实做过,而且运行良好。当然管理起来很痛苦,但便宜。
希望这篇庞大的博客能回答你的问题,帮助你弄清楚你项目需要的架构,或者至少读起来很有趣。