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中,我將web服務和管理器類配置爲不是單例。

Spring.NET XML配置在這裏。

Matlab的管理器配置:

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

MatlabService配置:從web.config中

<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文件

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

WCF服務配置。

<%@ ServiceHost Language="C#" Debug="true" Service="MatlabServiceService" Factory="Spring.ServiceModel.Activation.ServiceHostFactory" %> 
  1. 我相信,每一個客戶端web梅託德調用創建 MatlabService的新實例,WCF服務的工作是做新的線程(WCF服務 線程)和OS分配此線程CPU核心。

    或者我錯了,每次調用都會創建新的服務對象我必須在ServiceBehavior屬性中定義一個 InstanceContextMode?

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

  2. 在web方法MatlabService的計算我使用 System.Threading.Tasks用於並行所以數學工作是 做另一個線程(線程數學) 。

    對於每個調用都創建WCF服務線程和WCF服務 線程創建數學線程。

    我不確定這是否屬實。

    也許需要允許多線程在WCF服務 併發模式?

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,ConcurrencyMode = ConcurrencyMode.Multiple)

我想聽到的想法如何可以並行網絡對多核心CPU梅託德調用。 我谷歌它,但沒有找到任何明確和有用的,因爲我使用春天。用於創建WCF服務的.NET框架。

回答

1
  1. 默認實例上下文模式是PerCall,因此顯式設置是多餘的。

  2. 是的,你要創建一個額外的線程來執行的數學運算,但因爲你阻擋,直到任務完成後你沒有得到什麼。事實上,這是低效率的,因爲你必須創建和mangaging額外的線程的開銷。

每個網絡調用已經在其自己的線程中服務。

我可以看到添加額外的並行計算的唯一地方是執行中:

MatlabManager.CalculateWithFiniteElementMethod(data) 

然而,看起來像Matlab的調用。如果你可以使用並行代碼重新實現這個方法,你也許能伊克了一些性能提升。

不管你做什麼,分析是理解的關鍵,如果你真正使其更快。請記住 - 並行並不總是意味着更快。有一個在同步這些操作,併爲他們創建線程的開銷。