我读过一篇与 Imgur 创始人的问答,他详细解释了 Imgur 运行的服务器基础设施。以下是他所说的一小段话:
大部分集群使用 c1.xlarge 实例。上传集群处理所有上传和图片处理请求,如缩略图和调整大小,每个实例都是一个巨大的集群实例,cc1.4xlarge。
我知道图像不会占用太多空间,但为什么要走这条路呢?尤其是考虑到成本差异很大。
如果你想阅读整个问答,你可以在这里查看。我觉得很有趣。
答案1
S3 主要提供极高的耐用性和极低的管理开销。服务本身并不便宜(尤其是在处理请求时),但在大多数规模下,管理替代方案的人工成本会抵消任何节省的成本。然而,在非常大的规模下,节省的成本开始超过管理开销。
例如:
S3 上的 GET 请求每 10,000 个请求花费 0.004 美元。
T2.micro 的速度约为 180 Mbits/s,成本为 0.013 美元/小时。假设图像大小为 500kB(4000 kbits),则约为 46 张图像/秒。假设您可以使该实例饱和(大型图像共享服务大概可以做到这一点),则约为 165k 个请求/小时。
因此,对于 T2.micro,其成本为 0.013 美元/小时,而 S3 的成本为 0.066 美元。实际上,您可能会在 T2.micro 上遇到其他瓶颈,因此 S3 可能最终会在这个规模上略胜一筹。
但是,如果您使用 c4.8xlarge(使用 10Gbit 网络),则每小时费用为 1.763 美元。这样,您每秒可以提供大约 2620 张图片,或每小时约 9.4 万张图片。在 S3 上,每小时费用为 3.76 美元。加上预留实例折扣等,差额会更大。
除此之外,您无法将诸如调整图像大小之类的进程卸载到 S3,并且您可能还需要运行 WAF 或 DDoS 保护层以减少因攻击而造成的带宽成本。
话虽如此,一个常见的架构是存储原件在 S3 中(它们很少被访问,但持久性很重要)并在前端服务器上缓存调整大小的版本。我相信 Netflix 曾经或现在使用过这种技术(除了他们将缓存文件存储在自己的托管硬件上)。如果 Imgur 也这样做,我也不会感到惊讶。