ConcurrencyMode.Mehrere in stateless WCF-Dienste
Wir haben derzeit mehrere WCF-Dienste, die über die Standard -ServiceBehavior
. Aufgrund von Problemen mit der Skalierbarkeit, wir sind Blick auf die Anwendung des ConcurrencyMode = ConcurrencyMode.Multiple
- Attribut, um den Durchsatz zu steigern. Alle unsere service-Aufrufe sind völlig staatenlos, zum Beispiel:
PersonService.cs:
public class PersonService : IPersonService
{
public GetPersonResponse GetPerson(GetPersonRequest request)
{
GetPersonResponse response = new GetPersonResponse();
try
{
response.Person = Person.GetPerson(request.PersonID);
return response;
}
catch (Exception ex)
{
return (GetPersonResponse) response.SetException(ex);
}
}
}
Person.cs:
public static class Person
{
public static PersonDataContract GetPerson(int personID)
{
PersonDataContract pdc = null;
//load contract from db...
pdc = Database.Load<PersonDataContract>(personID);
//Address is another static class in the same pattern as Person
pdc.Addresses = Address.GetAddressesForPerson(personID);
return pdc;
}
}
Alle Methoden in der Person
- Klasse sind statisch zu helfen, die Leistung und die Staatenlosen für thread-Sicherheit. Die Database
Klasse ist auch statisch, aber Ihre Methoden-Referenz-statische Variablen.
In diesem Zusammenhang, was gemacht werden muß thread-sicher, um für ConcurrencyMode.Multiple
nicht dazu führen, multithreading-Probleme? Ich denke nur die Database
Klasse, aber macht das Person
Klasse (und alle anderen Klassen, die dem gleichen Muster Folgen) gesperrt werden müssen, wie gut?
Ich weiß, dass alle Klassen sollte bulletproofed für maximale Sicherheit, aber leider Zeitmangel nicht erlauben, dass diese... die wir brauchen, um code geliefert so bald wie möglich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie die Standardeinstellung verwenden "pro Anruf" Aktivierungs-Mechanismus (das funktioniert großartig, wenn Sie Ihre Dienstleistungen völlig stateless), es gibt absolut keinen Punkt, indem die
ConcurrencyMode.Multiple
da jede eingehende Anfrage eine eigene Instanz der service-Klasse zu behandeln Ihre Anfrage. Dies ist die bevorzugte und empfohlene Einstellung fürInstanceContextMode
.Lesen Sie mehr über Instanz-management im WCF auf MSDN Magazin: Entdecken Sie Mächtige Instanz-Management Techniken Für Entwicklung von WCF-Apps
Nur dann, wenn Sie von der Nutzung profitieren
ConcurrencyMode.Multiple
ist, wenn man eine singleton-WCF-Dienst - dies wird aber dringend abgeraten, da es a) ein großes Hindernis für die Skalierbarkeit und b) extrem kompliziert zu Programmieren, richtig.Meine Empfehlung wäre: versuche zu verengen mehr im detail was wirklich die Ursachen der performance-Probleme. Nur springen in
ConcurrencyMode.Multiple
scheint der falsche Ansatz - es ist sehr chaotisch, sehr arbeitsintensiv, viel code, viel chance, es falsch......Wenn Ihr service ist zustandslos und thread-sicher ist es besser, auf InstanceContextMode.Einzel -, kombiniert mit ConcurrencyMode.Mehrere.
Dadurch vermeiden Sie die Erstellung von Instanzen der service, reduzieren Sie den Speicherbedarf reduzieren GC-Aktivität.
Fast jeden service, den ich zu entwickeln, ist auf diese Art gemacht....
Es sei denn, es war die Notwendigkeit, eine separate Instanzen pro Anruf oder eine Sitzung, würde ich habe seinen Weg.
Anderen Antworten erwähnt "singleton WCF-Dienst - dies wird aber dringend abgeraten, da es a) ein großes Hindernis für die Skalierbarkeit und b) extrem kompliziert zu Programmieren, richtig."
Es ist NICHT sehr mutlos, hat keine Auswirkungen auf die Skalierbarkeit ( als eine Angelegenheit von der Tat kann benefitial ), und es ist NICHTS schwierig daran.