N'Service WCF utiliser plusieurs threads pour traiter les requêtes entrantes?
Comment puis-je m'assurer qu'un service WCF utilise des threads à partir d'un pool de threads pour traiter les messages entrants?
Au moment de la simple invocation de méthode comme " return null;' prend environ 45 secondes, tandis qu'une autre demande en cours de traitement
Voici comment j'ai annoté ma classe de service:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
public partial class MyService : IMyService {
...
}
Mais quand je regarde les processus dans le gestionnaire des tâches, il semble être l'utilisation d'un constant nombre de threads. Même sous charge.
public ActionResult SelectDatabase(string param)
{
if (!String.IsNullOrEmpty(param))
{
try
{
MyServicece svc = new MyService();
Database[] dbsArray = svc.GetDatabases(param);
if (depsArray != null)
ViewData["depsArray"] = depsArray;
return View();
}
catch (Exception exc)
{
//log here
return ActionUnavailable();
}
}
Voici mon comportement en service:
<?xml version="1.0"?>
<configuration>
<runtime>
</runtime>
<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>
<system.serviceModel>
<diagnostics performanceCounters="Default" />
<bindings>
<netTcpBinding>
<binding sendTimeout="00:02:00" receiveTimeout="00:02:00" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647">
<security mode="None">
</security>
</binding>
</netTcpBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<behaviors>
<endpointBehaviors>
<behavior name="CrossDomainServiceBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="MyService.MyServiceBehavior">
<serviceThrottling maxConcurrentCalls="100" maxConcurrentInstances="100" maxConcurrentSessions="100" />
<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="MyService.MyServiceBehavior" name="MyService.MyService">
<endpoint address="MyService" binding="netTcpBinding" contract="AService.IAServ" isSystemEndpoint="false" />
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
</service>
<service behaviorConfiguration="MyService.MyServiceBehavior" name="MyService.MyServiceAdmin">
<endpoint address="MyServiceAdmin" binding="netTcpBinding" contract="MyService.IMyServiceAdmin" isSystemEndpoint="false" />
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
Ici est de savoir comment je crée une instance de service:
ServiceHost myserviceHost = new ServiceHost(typeof(MyService), new Uri(String.Format("net.tcp://{0}/", _bindAddress)));
myserviceHost.Open();
Console.WriteLine(myserviceHost.BaseAddresses[0]);
InstanceContextMode = moyen Unique: vous avez un singleton - juste une seule instance du service. Pas très évolutif! ConcurrencyMode = Plusieurs moyens, qui singleton peut desservir plusieurs demandes de service à la fois - mais il signifie aussi, votre service de la mise en œuvre du code 100% de thread-safe - pas une tâche facile! Je vous conseille d'utiliser
double possible: stackoverflow.com/questions/1609703/...
Parfois InstanceContextMode = Unique est ok - par exemple lorsque l'API est apatride et juste transmet l'appel. Pas besoin d'avoir plus d'une instance du service jamais créé. Par exemple, les appels de méthode que le retour des trucs comme longueurs de file d'attente ou de transmettre des données à une file d'attente de traitement... Et de l'écriture 100% fil code de sécurité est le comportement standard pour certains d'entre nous - pas tout le monde est un script kiddie.
Veuillez voir mon udpated question.
InstanceContextMode.PerCall
et ConcurrencyMode.Single
- de cette façon, chaque entrant WCF demande a son propre instance d'un service de classe pour répondre à la demande. La WCF runtime peut gérer plusieurs demandes simultanées, votre code est facile à écrire.double possible: stackoverflow.com/questions/1609703/...
Parfois InstanceContextMode = Unique est ok - par exemple lorsque l'API est apatride et juste transmet l'appel. Pas besoin d'avoir plus d'une instance du service jamais créé. Par exemple, les appels de méthode que le retour des trucs comme longueurs de file d'attente ou de transmettre des données à une file d'attente de traitement... Et de l'écriture 100% fil code de sécurité est le comportement standard pour certains d'entre nous - pas tout le monde est un script kiddie.
Veuillez voir mon udpated question.
OriginalL'auteur kseen | 2012-02-17
Vous devez vous connecter pour publier un commentaire.
InstanceContextMode et ConcurrencyMode sont des concepts distincts, mais qui ont un niveau d'interaction - J'ai blogué à propos de ce en profondeur d'un moment de retour
WCF appels sont traités sur IO pool de threads les threads. En supposant que vous n'avez pas fait quelque chose comme
ConcurrencyMode.Single
,InstanceContextMode.Single
qui va sérialiser chaque appel dans le service du gestionnaire de pool de threads va essayer d'équilibrer le nombre de threads à la vitesse de travail.Si le nombre de requêtes simultanées peuvent être desservis par 5 fils alors que c'est la façon dont beaucoup de qu'il utilisera. Vous avez peut-être de voir que le pool de threads peut suivre le rythme de travail avec le nombre de threads que vous pouvez voir. Vous pouvez tout à fait heureux d'utiliser plus de threads que de cœurs avec effet parce que, aussi longtemps que les fils ne sont pas purement dépendant du PROCESSEUR, le système d'exploitation peut gagner le débit par la commutation de threads sur le CPU lors de la déjà thread en cours d'exécution commence IO. Si le CPU est complètement max avait alors l'heuristique de la threadpool gestionnaire de rendre réticents à ajouter plus de threads dans le pool de threads
Cependant, il ya un couple de problèmes potentiels:
Veuillez voir mon post de mise à jour.
faites-vous appel à fermer sur le proxy?
Non, je ne Fermez pas sur que.
C'est votre problème - vous avez atteint le point de saturation sur le MaxConcurrentSessions gaz. Chaque demande est d'avoir à attendre pour une session précédente délai d'attente. Près ou de réutiliser le proxy et vous devriez voir votre débit augmenter - j'ai blogué sur les sessions ici dotnetconsult.co.royaume-uni/weblog2/...
OriginalL'auteur Richard Blewett