트래픽이 많은 웹 서비스에 대한 힌트, C# asp.net sql2000
-
09-06-2019 - |
문제
저는 SQL Server 테이블에서 읽은 일종의 메시지 대기열을 표시하는 "동적 배너"에서 메소드가 호출되는 웹 서비스를 개발 중입니다.
배너는 트래픽이 많은 사이트의 홈 페이지에 큰 압력을 가할 것입니다.배너가 로드될 때마다 새 메시지 대기열을 얻기 위해 내 웹 서비스를 호출합니다.
지금:배너가 로드될 때마다 이 모든 트래픽이 데이터베이스에 대한 쿼리를 유도하는 것을 원하지 않으므로 asp.net 캐시(예:HttpRuntime.Cache[cacheKey])는 데이터베이스 액세스를 제한합니다.매분마다 캐시를 새로 고치도록 노력하겠습니다.
당연히 트래픽을 제한하기 위해 메시지를 가능한 한 적게 보내려고 노력할 것입니다.
그러나 그러한 시나리오를 처리할 수 있는 다른 방법이 있을 수도 있습니다.예를 들어 파일 시스템에 대기열의 마지막 버전을 기록하고 웹 서비스가 해당 파일에 액세스하도록 할 수 있습니다.아니면 두 가지 접근 방식을 혼합한 것...
해결책은 C# 웹 서비스, asp.net 3.5, SQL Server 2000입니다.
힌트가 있나요?다른 접근법?
감사해요
안드레아
해결책
그것은 많은 것들에 달려 있습니다:
- 데이터에 약간의 변화가 있는 경우("게시" 버튼이 있는 백엔드 또는 일일 배치를 생각해 보십시오) 정적 파일을 사용합니다(백엔드에서 푸시를 통해 업데이트됨).우리는 몇 개의 대규모 사이트에서 이 솔루션을 사용했고 정말 잘 작동했습니다.
- 데이터가 충분히 작으면 메모리 캐싱(예:Http Cache)가 실행 가능하지만 잠금 문제에 주의하고 Http Cache도 주의하세요. ~하지 않을 것이다 프레임워크에 메모리가 필요한 경우 항목이 조기에 만료될 수 있으므로 메모리 로드가 많은 경우에도 잘 작동합니다.나는 전에 그것에 물린 적이 있습니다!위의 주의사항으로 인해 Http Cache는 꽤 잘 작동합니다.
다른 팁
캐싱은 합리적인 접근 방식이며 한 단계 더 나아가 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;
}
}