2011-02-18 2 views
1

서버에 저장된 벡터 이미지의 다양한 줌 레벨에서 래스터 이미지 파일을 제공해야하는 애플리케이션을 개발 중입니다. 거리 및 건물의 데이터를 벡터화하고 특정 줌 레벨 및 좌표에 대한 고객의 요청에 대한 응답으로 Google지도와 유사한 서비스 용 PNG 타일을 즉석에서 생성한다고 가정 해 보겠습니다.즉시 작성된 이미지 파일의 고성능 캐싱을위한 아키텍처

내 경우에는 기본 벡터 데이터가 상당히 자주 변경되고 줌 레벨은 예를 들어 확대/축소 레벨보다 훨씬 가깝습니다. Google지도에서 12 개 정도의 고정 된 줌 단계. 따라서 가능한 모든 타일을 미리 계산하여 고성능 정적 미디어 서버에 업로드하는 것은 실용적이지 않습니다.

정적 타일을 생성하는 앱과 이후의 모든 요청을 정적 미디어 서버에서 제공 받기 위해 특정 타일에 대한 첫 번째 요청을 처리하는 우아한 방법이 있습니까?

앱 서버에서 타일을 생성하자마자 바로 정적 미디어 서버에서 사용할 수 있다고 가정합니다.

타일이 이전에 생성 된 경우 리다이렉션을 사용하는 명백한 방법은 (a) 앱 서버에 많은 불필요한 히트를로드하고 (b) 클라이언트는 이미지 데이터를 얻기 전에 두 개의 요청을 직렬로 전송해야하므로 응답 시간은 약 두 배가됩니다.

그래서 다른 아이디어를 찾고 있습니다. 예 : 고성능 정적 파일 제공을 시도하고 사용하도록 웹 서버를 구성하는 방법이 있습니까? 파일이 존재하지 않으면 404를 반환하는 대신 응용 프로그램을 호출하도록 폴백하는 방법이 있습니까?

답변

1

파일 캐시가 아직없는 경우 생성하는 것이 상대적으로 일반적인 문제이므로 웹 서버에서 직접 제공 할 수 있습니다.

NginX에는 try_files 옵션이 있습니다. 이것은 일련의 URI를 취하고 예상 한대로 응답을 찾을 때까지 각각의 URI를 시도합니다. 첫 번째 집합은 실패하지만 나중에 하나가 OK와 데이터를 반환하면 (그리고 거기에있는 동안 첫 번째 시도 파일 경로와 일치하는 파일을 만듭니다) 다음 요청이 단락됩니다. 그것을하지 않는다면

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

아파치,이 같은 URL을 통과, 특정 파일이 요청을 제공 할 경우 다음

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

, 우리는 확인 mod_rewrite는과 거의 같은 수행 한 것 스크립트를 생성하여 스크립트를 생성 할 수 있습니다.