Spring.NET フレームワークで 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 構成:
<object name="matlabService"
type="MatlabService"
singleton="false">
<property name="MatlabManager" ref="matlabManager"/>
</object>
web.config からの WCF サービス構成
<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 ファイル。
<%@ ServiceHost Language="C#" Debug="true" Service="MatlabServiceService" Factory="Spring.ServiceModel.Activation.ServiceHostFactory" %>
私は、クライアントごとに Web メソッド呼び出しが作成され、MatlabService の新しいインスタンスが作成され、WCF サービスの作業が新しいスレッド (WCF サービス スレッド) で行われ、OS がこのスレッドを CPU コアに割り当てると考えています。
または、私が間違っていて、ServiceBehavior プロパティ InstanceContextMode で定義する必要がある呼び出しごとに動作が新しいサービス オブジェクトを作成しますか?
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
MatlabService の Web メソッド Calculate では、並列化に System.Threading.Tasks を使用するため、数学作業は別のスレッド (数学スレッド) で行われます。
呼び出しごとに WCF サービス スレッドが作成され、WCF サービス スレッドでは Math スレッドが作成されます。
これが本当かどうかはわかりません。
ConcurrencyMode の WCF サービスでマルチスレッドを許可する必要があるのでしょうか?
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall,ConcurrencyMode = ConcurrencyMode.Multiple)]
マルチコア CPU の Web メソッド呼び出しを並列化する方法のアイデアを聞きたいです。私はそれをグーグルで検索しましたが、Spring.NETフレームワークを使用してWCFサービスを作成しているため、明確で有用なものは見つかりませんでした。