1

Spring.NET 프레임 워크를 사용하여 WCF 서비스를 만듭니다. 이 서비스는 수학 서비스 이며 클라이언트 응용 프로그램에 대한 계산을 제공합니다.WCF의 병렬 처리

멀티 코어 서버에서 WCF 서비스 병렬 처리에 대한 질문이 있습니다. 간단한 예를 들어 나는 20 개의 코어를 가진 서버를 가지고있다.

먼저 여기에 간단한 코드가 나와 있습니다.

//WS interface 
public interface IMatlabService 
{ 
    List<ResultData> Calculate(byte [] data); 
} 

//WS class definition 
[ServiceBehavior(Namespace = "http://server.com/MatlabService")] 
public class MatlabService: IMatlabService 
{ 
    public IMatlabManager MatlabManager{get;set:} 

    //web metod for math computations 
    public List<ResultData> Calculate(byte [] data) 
    { 
     var result = new List<ResultData>(); 

     //do math work in another thread 
     Task<List<ResultData>> task = Task.Factory.StartNew<List<ResultData>>(() => 
                  { 
                   return MatlabManager.CalculateWithFiniteElementMethod(data); 
                  }); 

     result.AddRange(task.Result) 

     return result; 

    } 
} 

public interface IMatlabManager 
{ 
    List<ResultData> CalculateWithFiniteElementMethod(byte [] data); 
} 

public class MatlabManager : IMatlabManager 
{ 
    public List<ResultData> CalculateWithFiniteElementMethod(byte [] data) 
    { 
     // do some math work 
    } 
} 

Spring.NET에서는 웹 서비스 및 관리자 클래스를 싱글 톤이 아닌 구성합니다.

Spring.NET XML 구성은 여기입니다.

matlab에 관리 프로그램 구성 :

<object name="matlabManager" 
      type="MatlabManager" 
      singleton="false"/> 

MatlabService 구성 :

<behavior name="Behavior1"> 
    <serviceMetadata httpGetEnabled="true"/> 
    <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 

<services> 
    <service name="matlabService" 
      behaviorConfiguration="Behavior1"> 
    <endpoint address="" 
      binding="basicHttpBinding" 
      contract="IMatlabService" 
      bindingNamespace="http://server.com/MatlabService"/> 
    <endpoint contract="IMetadataExchange" 
      binding="mexHttpBinding" 
      address="mex"/> 
    </service> 
</services> 

SVC 파일의 web.config에서

<object name="matlabService" 
      type="MatlabService" 
      singleton="false"> 
     <property name="MatlabManager" ref="matlabManager"/> 
    </object> 

WCF 서비스 구성. 나는 각 클라이언트의 웹 metod 호출에 대해 생각

  1. <%@ ServiceHost Language="C#" Debug="true" Service="MatlabServiceService" Factory="Spring.ServiceModel.Activation.ServiceHostFactory" %> 
    
    는 MatlabService의 새로운 인스턴스를 생성하고 WCF 서비스 작업은 CPU 코어에이 스레드를 할당 새 스레드 (WCF 서비스 스레드)와 OS에서 할 수 있습니다.

    또는 잘못된 동작으로 호출 당 새로운 서비스 개체를 만듭니다. ServiceBehavior 속성 InstanceContextMode에서 을 정의해야합니까?

    [인 ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)] 수학 작업 다른 스레드 (수학 스레드)를 수행한다 그래서 병렬화 System.Threading.Tasks를 사용 MatlabService의 계산 웹 방법에

  2. .

    각 호출마다 WCF 서비스 스레드가 만들어지고 WCF 서비스에서 스레드가 만들어집니다.

    사실인지 확실하지 않습니다.

    WCF 서비스에서 멀티 스레딩을 허용해야 할 수도 있습니다. ConcurrencyMode?

    [인 ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall, 들면, ConcurrencyMode = ConcurrencyMode.Multiple)]

    내가 멀티 코어 CPU를 요구 metod 웹을 병렬화 할 수있는 방법의 아이디어를 듣고 좋아할

. Google을 사용하지만 스프링을 사용하기 때문에 Google에 알기 쉽고 유용하지 않습니다.WCF 서비스 생성을위한 .NET 프레임 워크.

답변

1
  1. 기본 인스턴스 컨텍스트 모드는 PerCall입니다. 따라서 명시 적으로 설정하는 것은 중복됩니다.

  2. 예, 수학 연산을 수행 할 추가 스레드를 만들고 있지만 작업이 완료 될 때까지 차단 중이므로 아무 것도 얻지 못합니다. 실제로, 추가 스레드를 작성하고 mangaging하는 오버 헤드가 있기 때문에 효율성이 떨어집니다.

각 웹 호출은 이미 자체 스레드에서 처리됩니다. matlab에 대한 호출과 같은 그러나

MatlabManager.CalculateWithFiniteElementMethod(data) 

: 내가 추가 병렬 컴퓨팅을 추가 할 볼 수 있습니다

유일한 장소의 구현에 있습니다. 병렬 코드를 사용하여 해당 메소드를 다시 구현할 수 있다면 성능을 향상시킬 수 있습니다.

무엇을 하든지 프로파일 링을 사용하면 실제로 더 빠르게 만들 수 있습니다. 기억하십시오 - 평행이 항상 더 빠른 것은 아닙니다. 이러한 작업을 동기화하고 스레드를 만드는 데 오버 헤드가 있습니다.