我们目前在许多边缘站点使用 CloudFront 来提供动态调整为不同大小尺寸的产品图像(接近一百万)。我们的 Cloudfront 发行版使用原始 EC2 php 脚本从 S3 检索原始图像,根据提供的查询字符串标准(宽度、高度、裁剪等)动态转换它,并将其流式传输回 Cloudfront,后者将其缓存在边缘位置。
但是,第一次加载非缓存图像的网站访问者会受到这种相当大的转换的打击。
我们希望能够“预缓存”我们的图像(通过使用请求每个图像 url 的批处理作业),这样最终用户就不会第一个点击特定尺寸的图像,等等。
不幸的是,由于图像仅缓存在分配给预缓存服务的边缘位置上,因此使用另一个边缘位置的网站访问者将无法获得缓存的图像,并且会受到源服务器上大量调整大小的脚本的影响。
我们提出的唯一解决方案是,每个边缘位置都可以在合理的加载时间内检索图像,这是:
我们有一个指向原始 EC2 php 脚本的 Cloudfront 发行版。但是,原始脚本没有进行上述图像转换,而是将请求和查询字符串参数转发到另一个 Cloudfront 分发。此发行版具有执行图像转换的原始 EC2 php 脚本。这样,图像始终缓存在我们的 EC2 实例(爱尔兰)附近的边缘位置,从而避免在从另一个边缘位置请求图像时执行另一次转换。
因此,例如,瑞典的请求命中 /image/stream/id/12345,瑞典边缘位置没有缓存,因此它将请求发送到源,即爱尔兰的 EC2 机器。然后,EC2“流式传输”页面从另一个 Cloudfront 发行版加载 /image/size/id/12345,该发行版到达爱尔兰边缘位置,该边缘位置也没有缓存。然后它向源端发送请求,同样是同一台 EC2 机器,但发送到调整大小的“大小”页面。此后,瑞典和爱尔兰的边缘站点都缓存了图像。
现在,来自法国的请求请求相同的图像。法国边缘位置没有缓存它,因此它调用源,即爱尔兰的 EC2 机器,它调用再次命中爱尔兰边缘位置的第二个 CF 分发。这次它确实缓存了图像,并且可以立即返回。现在法国边缘位置也缓存了图像,但不必调用“调整大小”页面 - 只有在爱尔兰缓存图像的“流媒体”页面。
这也意味着我们在爱尔兰的“预缓存”批处理服务可以对爱尔兰边缘位置进行请求,并在我们的网站访问者请求图像之前预缓存图像。
我们知道这看起来有点荒谬,但我们希望最终用户在调整图像大小时永远不必等待很长时间,这似乎是唯一切实可行的解决方案。
我们是否忽略了另一个/更好的解决方案?对以上内容有何评论?