2013-02-10 2 views
5

ASP.NET 웹 API를 사용하여 문서 관리 서비스를 구성하고 있으며 성능은 이고 일부는입니다.ASP.NET 웹 API StreamContent와 IIS 정적 파일 처리기

IIS/ASP.NET ImageResizer 모듈 작성자 인 Nathanael Jones가 this article을 기반으로 정적 파일 제공의 "최적"성능에 필요한 몇 가지 선입관을 개발했습니다. 그 존재의 PRECIS : 매우 일찍 ASP.NET 파이프 라인 때문에

  1. HttpModule를 사용합니다 (이하 파이프 라인 = 더 최적화)와 HttpHandler보다는 이런 종류의 물건을 처리하기 쉬운 것으로 밝혀졌습니다.
  2. Response.WriteFile(filename)Response.Write(memBuffer)보다 좋습니다. 여기서 memBuffer는 메모리 내 C# 버퍼입니다.
  3. URL 다시 쓰기 (즉, Context.RewritePath(virtualPath))는 잘 최적화 된 IIS 정적 파일 처리기를 사용하기 때문에 Response.WriteFile(filename)보다 좋습니다.

문제는, 난 여전히 하단 (here), 내 URL 재 작성 기법 자체가 작동하지 않는 얻을 수없는 기괴한 캐싱 문제 덕분이다. 의 파일 서빙 부분 때문에,이 분명히 것들을 비트 깔끔한을 만드는 웹 API 솔루션을

public Task<HttpResponseMessage> DoTheFoo() 
{ 
    return Task<HttpResponseMessage>.Factory.StartNew(() => 
    { 
     var response = new HttpResponseMessage(); 
     response.Headers.Add("Content-Disposition", "inline; filename=\"" + attachmentFileName + "\""); 
     response.Headers.Add("content-type", mimeType); 
     response.Content = new StreamContent(File.OpenRead("somefile.doc")); 

     return response; 
    }); 
} 

: 그래서

는 지금은 다음과 같은 많은 웹 API 중심의 구현에 대해 궁금 왼쪽 해요 서비스는 컨트롤러의 다른 작업과 함께 바로 갈 수 있지만 성능과 확장 성은 얼마나 좋은가? 내가 생각하는 요소 :

  1. 네트워크 대역폭. 여기서 차이점은 없지만 모든 기술은 동일한 바이트 수를 쓰고 있다는 것입니다.
  2. 나가는 네트워크 스트림에 쓰는 속도. IIS 정적 파일 처리기가 ASP.NET 파이프 라인보다 약간 더 좋을 수 있습니까? 아마도 통합 된 파이프 라인에 관한 문제는 아닐까요? 이 서비스는 소비자 수준의 수십 - 백 킬로 비트 DSL 라인에서 최대 1 기가비트 LAN까지 제공 될 것입니다.
  3. RAM 사용. StreamContent 구현이 IIS 정적 파일 처리기만큼 효율적이지 않다고 가정합니다.
  4. CPU 사용량입니다. RAM과 마찬가지로 StreamContent가 IIS 정적 파일 처리기보다 조금 더 까다로울 것으로 가정하고 있습니다.
  5. 서버 쪽 캐싱. IIS 정적 파일 처리기는이 기능을 제공합니다 (자체적으로 작동하지 않는 것처럼 보이기 때문에 번거로웠다).하지만 StreamContent 구현보다 먼저 이점을 제공 할 것입니다. 나는 서비스가 많은 사람들이 다른 파일 요청에 응답 할 확률이 더 높기 때문에 이러한 측면에 대해 그렇게 걱정하지 않는다.

내가 함께 실제 성능 수치를 얻기 위해이 테스트하는 서버 팜을 넣을 수있는 위치에 아니에요, 나는 작은 규모의 테스트 결과를 감안하면 정확한 아무것도 줄 것이다 올시다. 그래서 알고있는 사람들로부터, 나는 어떤 종류의 차이를 기대할 수 있습니까?URL 재 작성 구현을 포기할 준비가 거의 끝났지 만 성능면에서 눈에 띄는 성능을 얻을 수 있다면 끈기있게 할 것입니다.

+0

웹 API/WCF/MVC 솔루션을 사용할 것을 고려해 볼 수 있습니다. 그것은 RAM과 동시성의 관점에서 끔찍한 것입니다. ImageResizer의 DiskCache는 비 이미지 데이터에 개방되어 있습니다. –

+0

캐싱의 성능이 향상되었습니다 (그리고 바니시는 캐싱 도구 임). 위에서 말했듯이 "서비스는 반복적으로 동일한 파일 요청과는 반대로 많은 다른 파일 요청에 응답 할 가능성이 더 큽니다. 반복 요청이 없으면 캐시는 비효율적입니다. 또한 각 요청마다 처리해야하는 인증 규칙이 있으며, 이는 바니시의 작동 방식에 따라 문제가 발생할 것이라고 생각합니다. – Snixtor

+0

@ComputerLinguist 웹 API는 RAM 및 동시성 관점에서 "끔찍한"것이라고 설명합니다. 그러나 대안에 비해 어떻게 쌓일 수 있습니까? 나는 "300 - 1000x"성능 향상에 대해 말하지 않고 있습니다. 바니시는 캐시 된 시나리오에서 캐시를 주장하고 있습니다. 캐시되지 않은 요청의 원시 성능을 조사하고 있습니다. 서비스 요청의 대부분이 거짓말. – Snixtor

답변

1

Azure에서 호스트하려는 경우 확실하지 않지만 이미지에 전용 공용 BLOB 저장소 컨테이너를 사용할 수는 있습니다. 그런 다음 CDN 서비스를 사용하여 정적 파일을 제공 (및 캐시)하십시오. 이렇게하면 API에서 문제를 정적 리소스를 처리하도록 설계된 CDN으로 옮깁니다.

+0

질의 응답 시간의 의도는 IIS에서 호스팅되는 것이 었습니다. Azure blob 데이터 저장소와 일치하지 않는다고 생각합니까? 그것은 내 상황에 반드시 적용되는 것은 아니지만, 다른 접근법에 대한 흥미로운 고려 사항입니다. – Snixtor

+0

그래서 blob 저장소를 사용하여 이미지/정적 리소스를 저장하면됩니다. 이들은 CDN 서비스를 통해 HTTP를 통해 제공됩니다. –