문제

저는 SQL Server 테이블에서 읽은 일종의 메시지 대기열을 표시하는 "동적 배너"에서 메소드가 호출되는 웹 서비스를 개발 중입니다.

배너는 트래픽이 많은 사이트의 홈 페이지에 큰 압력을 가할 것입니다.배너가 로드될 때마다 새 메시지 대기열을 얻기 위해 내 웹 서비스를 호출합니다.

지금:배너가 로드될 때마다 이 모든 트래픽이 데이터베이스에 대한 쿼리를 유도하는 것을 원하지 않으므로 asp.net 캐시(예:HttpRuntime.Cache[cacheKey])는 데이터베이스 액세스를 제한합니다.매분마다 캐시를 ​​새로 고치도록 노력하겠습니다.

당연히 트래픽을 제한하기 위해 메시지를 가능한 한 적게 보내려고 노력할 것입니다.

그러나 그러한 시나리오를 처리할 수 있는 다른 방법이 있을 수도 있습니다.예를 들어 파일 시스템에 대기열의 마지막 버전을 기록하고 웹 서비스가 해당 파일에 액세스하도록 할 수 있습니다.아니면 두 가지 접근 방식을 혼합한 것...

해결책은 C# 웹 서비스, asp.net 3.5, SQL Server 2000입니다.

힌트가 있나요?다른 접근법?

감사해요

안드레아

도움이 되었습니까?

해결책

그것은 많은 것들에 달려 있습니다:

  • 데이터에 약간의 변화가 있는 경우("게시" 버튼이 있는 백엔드 또는 일일 배치를 생각해 보십시오) 정적 파일을 사용합니다(백엔드에서 푸시를 통해 업데이트됨).우리는 몇 개의 대규모 사이트에서 이 솔루션을 사용했고 정말 잘 작동했습니다.
  • 데이터가 충분히 작으면 메모리 캐싱(예:Http Cache)가 실행 가능하지만 잠금 문제에 주의하고 Http Cache도 주의하세요. ~하지 않을 것이다 프레임워크에 메모리가 필요한 경우 항목이 조기에 만료될 수 있으므로 메모리 로드가 많은 경우에도 잘 작동합니다.나는 전에 그것에 물린 적이 있습니다!위의 주의사항으로 인해 Http Cache는 꽤 잘 작동합니다.

다른 팁

캐싱은 합리적인 접근 방식이며 한 단계 더 나아가 SQL 종속성을 추가할 수 있다고 생각합니다.

ASP.NET 캐싱:SQL Server 2000의 SQL 캐시 종속성

파일 경로로 이동하는 경우 이 점을 명심하십시오.

http://petesbloggerama.blogspot.com/2008/02/aspnet-writing-files-vs-application.html

파일을 작성하는 것이 더 나은 솔루션입니다. IMHO - 엄청난 asp.net 오버헤드 없이 IIS 커널 코드로 제공되며 나중에 파일을 CDN에 복사할 수 있습니다.

AFAIK 종속성 캐싱은 SQL Server 2000에서 그다지 효율적이지 않습니다.

또한 Skliwz에서 언급한 메모리 제한을 해결하는 한 가지 방법은 일반 애플리케이션 외부에서 이 서비스를 사용하는 경우 자체 앱 풀에서 격리할 수 있다는 것입니다.나는 이전에 이것이 도움이 되는 것을 본 적이 있습니다.

모두 감사합니다. 데이터 크기는 작지만 기본 테이블이 변경되므로 HttpCache 방식을 사용하겠습니다.데이터가 변경되는 경우에도 실제로 DB 액세스를 줄이는 방법이 필요합니다. 이것이 @Bloodhound가 제안한 대로 직접 Sql 종속성을 사용하지 않는 이유입니다.

공개되기 전에 스트레스 테스트를 좀 해볼 것 같아요.

다시 한번 감사드립니다.

물론 다음에서 캐싱 기능을 사용할 수도 있습니다. SixPack 라이브러리 .

  • 클래스에 속성을 추가하여 작동하는 HttpCache를 기반으로 하는 정방향(일반) 캐시입니다.사용이 가장 간단하지만 어떤 경우에는 데이터베이스에서 콘텐츠를 실제로 가져올 때까지 기다려야 합니다.
  • 처음부터 캐시를 미리 가져오면 첫 번째 호출 후 백그라운드에서 캐시 새로 고침이 시작되며 경우에 따라 기다리지 않고 콘텐츠를 확보할 수 있습니다.

자세한 내용은 SixPack 라이브러리 홈페이지.코드(특히 정방향 캐시)는 로드 테스트되었습니다.

다음은 간단한 캐싱의 예입니다.

    [Cached]
    public class MyTime : ContextBoundObject
    {
            [CachedMethod(1)]
            public DateTime Get()
            {
                    Console.WriteLine("Get invoked.");
                    return DateTime.Now;
            }
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top