2010-08-10 9 views
2

1000 개 이상의 속성 (집세, 판매) 기록이 포함 된 XML 피드가 있습니다. 이 시나리오가 작동 된XML 피드를 로컬에서 캐시하는 가장 좋은 방법은 무엇입니까?

은 현재 항상 등 3 새 집, 3 개 개의 새 아파트와 같은 특정 기준 만 3 속성을 반환, 홈페이지에이 피드 16 배를 호출하고, 5 집, 5 개 추천 아파트 등을 추천합니다 잘 7 개월 동안 200 + 속성과 하루에만 100-200 조회가 발생했습니다. 이제 하루 700 회 이상 방문하고 1000 개가 넘는 사이트를 방문하고 홈페이지를 느리게하고 트래픽이 크게 증가하고 있음을 보여주기 위해 별도로 16 개의 피드를 다운로드하는 단계로 넘어 가고 있습니다.

따라서 이러한 스트림을 캐시하고 싶습니다. 원본과 모든 방문자의 스트림을 직접 다운로드하여 내 로컬 복사본을 사용하여 훨씬 빠르게 작업하고 트래픽 부하를 크게 줄이려합니다.

XML을 로컬로 다운로드하고 로컬로 파일을 호출하여 데이터를 표시하는 데 문제가 없습니다. 하지만 같은 가능한 문제를 해결하는 방법을 알고 싶습니다 :

  • 로봇이 지역으로 XML 파일을 사용하여로드 새로운 데이터
  • 동안 덮어 빈 될 XML 파일과 원본 파일을 업데이트하기 때문에 클라이언트에 데이터를 표시하지 백업, 원본 서버 인 경우 오프라인 홈페이지 내가 그 로봇이 파일을 업데이트 할 수없는 것 등의 방법으로 고객을 위해 잠금 데이터를 실 거예요 것을 확인
  • 작업 및로드 여전히 것을 의미

내 첫 toughts는 것 이브에 대한 2 xml 파일 작업 클라이언트에게 보여지는 스트림과 다운로드 될 스트림이있다. 다운로드가 올바른 경우 다운로드 된 XML이 라이브 데이터로 사용되고 다른 하나는 삭제됩니다. 하나의 파일이 실제 데이터의 이름을 가진 파일로 작동하는 점진적인 표시.

비슷한 방식으로 XML 파일을 캐싱하는 방법이 있습니까? 정말로 중요한 문제는 방탄 솔루션을 통해 클라이언트가 오류 페이지 나 빈 결과를 보지 못하게하는 것입니다.

감사합니다.

답변

1

HttpWebResponse에 내장 된 캐싱 옵션을 사용하십시오. 이를 통해 캐시에서 직선적으로 획득 (신선도 무시), 캐시 무시, 캐시 새로 고침 강제, 캐시 유효성 재확인 및 원본 응답의 나이에 따라 캐시가 정상적으로 사용되는 경우의 정상 동작 중 선택할 수 있습니다 정보를 수집하고, 다른 방법으로이를 다시 검증해야합니다.

실제 캐싱 요구 사항을 넘어서는 경우에도 완벽한 대체 기능이 아닌 HTTP 캐싱 기능을 기반으로 구축하십시오.

XML 스트림의 자체 캐시를 관리해야하는 경우 일반 파일 잠금이 필요하며 실제로 필요한 경우 .NET ReaderWriterLockSlims를 사용하면 서로 다른 스레드가 서로 엉망이되지 않도록 할 수 있습니다. 경합의 위험을 너무 높게하는 한 가지 가능성은 캐시 경합의 경우 직접 액세스로 기본 설정하는 것입니다. 캐싱이 궁극적으로 최적화라고 생각하십시오. 개념적으로 파일을 "서버에서 가져 오는 중"캐싱을 사용하면보다 효율적으로이 작업을 수행 할 수 있습니다. 따라서 신속하게 읽기 잠금을 얻지 못하면 다운로드로 직접 되돌릴 수 있습니다. 이는 쓰기 잠금이 발생할 수있는 대기 시간을 줄입니다 (쓰기 잠금이 요청되는 동안 보류중인 잠금이 시간이 지남에 따라 쌓이지 않기 때문에).실제로는 매우 자주 발생하지는 않지만 아마도 한 파일을 둘러싸고 시스템 전체가 다운되는 등의 용납 할 수없는 경합의 위험으로부터 당신을 구할 수 있습니다.

+0

아, 정상적인 캐시를 처리하는 또 다른 옵션은 허용되는 정도의 정상성을 추가하는 것입니다. ("신선하다면 나에게 주거나 평소에 구식이라고 생각하지는 않지만 4 시간 이내에 구식이라고 생각하면된다"). –

+0

파일의 실제 크기 나 상태를 확인하고 캐시/동기화가 다른 경우에만 확인할 수 있습니까? – feronovak

+0

변경 사항을 적용 할 수 있으면 (그리고 실제로는 종종 그렇듯이) 동일한 크기의 파일이 만들어지기 때문에 더 많은 노력을 기울여야합니다. 당신은 파일의 MD5 나 WebResponse가 가지고있는 E-tag를 저장할 수 있습니다. (E-tag가 보내지는 것이 더 좋으며, 가능하다면 웹 측을 실행하는 사람에게 berate하지 않을 때까지) 또는 마지막으로 웹 응답에서 -mod date (이 시스템에서 1 초 미만의 변경이 불가능한 경우). 다시, last-mod 및 etags를 확인하는 것은 적절한 옵션을 사용할 때 HttpWebResponse에 내장 된 웹 캐시를 적절히 사용하여 자동으로 발생합니다. –

0

소스 XML 피드를 생성하는 코드를 소유하고 있지 않다는 가정하에 시작하겠습니다. 왜냐하면 실행하려는 쿼리에 대한 특정 지원을 추가하는 것입니다.

제 3 자 피드와 비슷한 문제가있어서 하루에 몇 번 실행되는 피드를 다운로드하고 구문 분석 한 다음 결과를 데이터베이스에 로컬로 저장합니다.

데이터베이스를 업데이트 할 때마다 약간의 비교 작업을 수행하고 새 레코드를 추가하고 오래된 레코드 만 삭제해야하지만 항상 클라이언트에 피드 할 수있는 데이터가 있어야하며 데이터베이스는 다음과 같은 간단한 문제를 해결합니다. 파일 잠금.

그런 다음 간단한 서비스 계층을 살펴보고 로컬 저장소의 데이터를 노출합니다.

+0

데이터베이스에서 비교를 수행하는 것보다 간단한 것은 업데이트시 자동으로 업데이트되는 버전 열을 갖는 것입니다. 그런 다음 마지막으로 수정 한 값 (데이터 시간이고 응용 프로그램에 1 초의 해상도가 충분할 경우) 및/또는 전자 태그를 만드는 데 사용할 수 있습니다 (더 정밀한 해상도의 datetime에서 작동하며, 업데이트 간의 시간차가있을 경우 작동합니다.) –

+0

아니요 원본 XML 피드 코드에 액세스 할 수 없습니다. 나는 구조가있어서 그걸로 일할 필요가있어. 5 분마다 캐싱에 대해 생각하고 있는데 데이터가 상당히 변동하기 때문입니다. – feronovak

관련 문제