2014-05-20 2 views
2

내가Autofac WCF는 - CloseChannel은 부하 테스트

응용 프로그램은 타사 WCF 서비스 호출을 (요청/초 100의) 부하가 크게 둔화되는 webapi 응용 프로그램을 프로파일 링하고 아래에 여러 번했다. 내가 dottrace를 사용하고있어

Autofac.Integration.Wcf.RegistrationExtensions.CloseChannel(T)이 DotTrace은 핫스팟으로이 문제를 확인했습니다

(1 분 100 클라이언트/초) 내 시험 중에> 22K 번 호출되는 것을 알 수 있습니다.

나는 Autofac WCF 통합 문서에 따라 내 WCF 등록 :

var bookingManagerFactory = new ChannelFactory<IBookingManager>("IBookingManager"); 

builder.Register(c => bookingManagerFactory).SingleInstance(); 

builder.Register(c => c.Resolve<ChannelFactory<IBookingManager>>().CreateChannel()).UseWcfSafeRelease(); 

이 동작이 예상되어 있습니까? 응용 프로그램 간

, 그것은 InstancePerDependency 기본 수명 것을 나의 이해의 IBookingManager
에 따라 많은 종류가 있습니다 - 내 시나리오에서 그 적합은? .InstancePerRequest()를 CreateChannel() 메서드에 더 적용 할 수 있습니까?)

답변

3

짧은 대답 : 예상했는데 문제가 아닌 것 같습니다. 그것에

약간 더 강하 :

Autofac 배치된다 일회용 것을 가리킬 때의 수명 범위가 배치 될 때까지 일회용 객체에 보유하고있다. (객체를 Owned으로 등록하면 수동으로 처리 할 수 ​​있지만 WCF의 경우에는 남겨 두겠다.)

WCF 채널은 일회용이기 때문에 약간의 악명이 있지만 IDisposable 구현은 채널에 오류가 발생하면 예외를 throw합니다 (예 : 오류 응답이있는 경우). 실제로는 매우 나쁜 처리 설계입니다. 어쨌든, 그게 바로 UseWcfSafeRelease입니다. 채널을 올바르게 닫거나 상태를 기반으로 채널을 중단하여 채널이 제대로 처리되도록합니다. CloseChannel은 적절한 정리를 처리하는 방법 일뿐입니다.

채널을 여러 개 해결하는 경우 채널이 모두 정리되어야합니다. CloseChannel이 22,000 번 호출되는 것을 보면 22,000 개의 인스턴스가 모두 정리되어야한다는 것을 의미합니다.

나는 평생 범위를 바꾸 겠다는 것을 모른다. 또 다른 WCF 문제는 채널에 오류가 발생하면 클라이언트 프록시를 재사용 (또는 다시 열 수 없음)한다는 것입니다. 이제 끝났고 새 채널이 필요합니다.

솔루션을 최적화하는 더 좋은 방법은 생성자에서 Func<IBookingManager>을 해결하는 것입니다. 프록시가 필요할 때마다 함수를 호출하여 새 함수를 얻습니다. 두 가지 장점을 제공

public class MyConsumer 
{ 
    private Func<IBookingManager> _factory; 
    public MyConsumer(Func<IBookingManager> factory) 
    { 
    this._factory = factory; 
    } 
    public void DoWork() 
    { 
    this._factory().CallOperation(input); 
    } 
} 

:

  1. 당신은 이 채널이 해결하지 않아도 당신이 채널 (및 폐기)의 생성을 저장할 수있는 클래스의 메소드가있는 경우.
  2. 오류 (예 :, timeout/retry), 오래된 프록시가 고장 났을 때 새로운 프락시를 생성 할 수 있고 클래스가 더 내결함성을 가질 수 있습니다.

외부의 질문 : CloseChannel 전화를 피하려고 애 쓰지 않을 것 같습니다. 최적화가 필요한 경우 만드는 채널 수를 최적화하십시오.

+0

게으른 를 전달하는 것이 같을까요? – Alex

+1

하나의 인스턴스에 대해서만 지연 지연 해결. 당신이 오직 하나만 필요로하고 단 하나의 전화를 걸면 (또는 내결함성이 필요하지 않다면) 게으른 것이 좋습니다. 그러나 Func을 사용하는 것만 큼 쉽고 더 유연합니다. 나는 당신의 상황에 대해 Faz over Lazy를 강력히 추천한다. –

+0

Func 을 전달하면 BeginInvoke를 사용해야합니까? 호출? – Alex