Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 为什么Cloudfront会在几个小时内从缓存中逐出对象?_Image_Caching_Amazon Cloudfront - Fatal编程技术网

Image 为什么Cloudfront会在几个小时内从缓存中逐出对象?

Image 为什么Cloudfront会在几个小时内从缓存中逐出对象?,image,caching,amazon-cloudfront,Image,Caching,Amazon Cloudfront,Cloudfront配置为缓存我们应用程序中的图像。我发现这些图像很快就从缓存中删除了。由于图像是动态生成的,这对我们的服务器来说是非常紧张的。为了解决这个问题,我设置了一个测试用例 原点标题 图像从我们的原始服务器提供,带有正确的Last Modified和Expires标题 Cloudfront缓存行为 由于该站点仅为HTTPS,我将Viewer协议策略设置为HTTPS转发标头设置为无和对象缓存设置为使用原始缓存标头 初始映像请求 我要求在11:25:11拍一张照片。这返回了以下状态和标

Cloudfront配置为缓存我们应用程序中的图像。我发现这些图像很快就从缓存中删除了。由于图像是动态生成的,这对我们的服务器来说是非常紧张的。为了解决这个问题,我设置了一个测试用例

原点标题 图像从我们的原始服务器提供,带有正确的
Last Modified
Expires
标题

Cloudfront缓存行为 由于该站点仅为HTTPS,我将
Viewer协议策略设置为
HTTPS
<代码>转发标头
设置为
对象缓存
设置为
使用原始缓存标头

初始映像请求 我要求在11:25:11拍一张照片。这返回了以下状态和标题:

  • 代码:200(正常)
  • 答:没有

  • 到期时间:2016年9月29日星期四09:24:31 GMT

  • 最后修改:2015年9月30日星期三09:24:31 GMT
  • X-Cache:cloudfront未命中

后续请求 稍晚(11:25:43)重新加载后,返回的图像包含:

  • 代码:304(未修改)
  • 约翰:是的

  • 到期时间:2016年9月29日星期四09:24:31 GMT

  • X-Cache:从cloudfront命中

几小时后的一个请求 将近三个小时后(14:16:11),我转到同一页,图像加载了以下内容:

  • 代码:200(正常)
  • 约翰:是的

  • 到期时间:2016年9月29日星期四09:24:31 GMT

  • 最后修改:2015年9月30日星期三09:24:31 GMT
  • X-Cache:云端未命中

由于图像仍由浏览器缓存,因此加载速度很快。但我无法理解Cloudfront如何无法返回缓存的映像。因此,应用程序必须再次生成图像

我读到Cloudfront在几天不活动后将文件从缓存中逐出。上述情况并非如此。这怎么可能

我读到Cloudfront在几天不活动后将文件从缓存中逐出

你有官方的消息来源吗

以下是官方的答案:

如果边缘位置中的对象不经常被请求,CloudFront可能会逐出该对象并在其过期日期之前移除该对象,以便为最近请求的对象腾出空间

缓存对象的保留时间没有保证,需求量低的对象更有可能被逐出。。。但这不是你可能没有考虑的唯一因素。驱逐可能不是问题,也不是唯一的问题

CloudFront缓存的对象就像薛定谔的猫。这是一个松散的类比,但我用它来运行:一个对象在任何给定时刻是否“在cloudfront缓存中”不是一个是或否的问题

CloudFront在37个城市中大约有53个(您的浏览器连接在这里,内容以物理方式存储)。一些大城市有2个或3个。到达cloudfront的每个请求都会(通过DNS)路由到理论上最理想的位置——为简单起见,我们将其称为距离您所在位置最近的边缘

Cloudfront的内部工作机制不是公开信息,而是基于观察的普遍共识,即这些边缘位置都是独立的。他们不共享缓存

例如,如果您在德克萨斯州(美国),并且您的请求路由通过并缓存在德克萨斯州达拉斯/沃思堡,并且如果您的任何请求都可能命中达拉斯边缘的任意一个位置,那么在您两次未命中同一对象之前,您的下一个请求将是未命中的概率约为50/50。如果我从我的位置请求同一个对象,我从经验中知道,该对象的路径往往是通过南本德,在,那么我的第一个请求被错过的几率是100%,即使它缓存在达拉斯

因此对象既不在缓存中也不在缓存中,因为没有“单一、全局”缓存。

CloudFront确定与浏览器“最近”的边缘也可能会随着时间的推移而改变。

CloudFront确定最近边缘的机制似乎是动态和自适应的。互联网拓扑结构的变化可能会改变哪个边缘位置将倾向于接收来自给定IP地址的请求,因此,在几个小时内,您连接到的边缘可能会发生变化。维护或中断或影响特定边缘的其他问题也可能导致来自给定源IP地址的请求被发送到与典型边缘不同的边缘,这也可能给您留下对象被逐出的印象,因为新边缘的缓存将不同于旧边缘

查看响应头,无法确定哪个边缘位置处理每个请求。但是,此信息在中提供

我有一个获取和调整图像大小的服务,每天处理大约750000张图像。它在CloudFront后面,我的命中率大约是50/50。这当然不全是CloudFront的错,因为我的图像库超过了800万,观众遍布全世界,而且我的
max age
指令比你的短。自从我上次分析日志以确定哪些“未命中”以及“未命中”是如何出乎意料已经有相当长的一段时间了(虽然当我这样做时,确实有一些,但它们的数量并不是不合理的),但这很容易做到,因为日志会告诉您每个响应是命中还是未命中,以及识别边缘位置。。。所以你可以分析一下,看看这里是否真的有一个模式

我的服务将其所有输出内容存储在S3中,并且在新请求时
server-54-240-144-13.iad12.r.cloudfront.net.
server-205-251-252-153.ind6.r.cloudfront.net.