用于高性能缓存动态创建的图像文件的体系结构

时间:2011-02-18 22:23:28

标签: web-services performance apache architecture

我正在开发一个应用程序,它需要以存储在服务器上的矢量图像的不同缩放级别提供光栅图像文件。想象一下,对街道和建筑物进行矢量化数据处理,并动态生成一个类似谷歌地图的服务的PNG图块,以响应客户对特定缩放级别和坐标的请求。

在我的情况下,基础矢量数据经常变化,加上缩放级别的增量比例如更接近。 Google地图中的十几个固定缩放步骤。因此,对我来说,预先计算所有可能的图块并将它们上传到高性能静态媒体服务器是不切实际的。

是否有一种优雅的方式来从生成它的应用程序获取特定磁贴的第一个请求以及从静态媒体服务器提供的所有后续请求?

假设只要我在应用服务器上生成磁贴,我就可以立即在静态媒体服务器上使用它。

如果先前已生成磁贴,则使用重定向的明显方法是次优的,因为它将(a)加载具有许多不必要命中的应用服务器,以及(b)降低客户端的整体性能因为浏览器需要在获取图像数据之前串行发送两个请求,所以响应时间大约加倍。

所以我正在寻找其他想法。例如。有没有办法配置Web服务器尝试使用高性能静态文件服务,如果文件不存在,那么回退到调用应用程序而不是返回404?

1 个答案:

答案 0 :(得分:1)

如果文件缓存尚不存在,这是一个相对常见的问题,因此可以直接由网络服务器提供。

在NginX中,有try_files选项。这需要一组URI,并且如您所料,尝试每个URI,直到找到响应。如果第一个设置失败,但是后一个设置返回OK并且数据(当它在那里时,也会创建一个与第一个try-file路径匹配的文件),那么下一个请求就会被短路。

try_files $uri $uri/ /makeCacheFile.php?q=$uri&$args;

在Apache中,类似这样的东西与mod_rewrite

的表现大致相同
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ /makeCacheFile.php?q=$1 [L,QSA]

在这里,我们检查是否为请求提供了特定文件,如果没有,请将URL传递给可能继续生成它的脚本。