Laden...

Synchronisation umgehen

Letzter Beitrag vor 13 Jahren 5 Posts 1.299 Views
Synchronisation umgehen

Hallo zusammen
Ich habe hier gerade folgende Situation:
Meine ASP .NET MVC3 Applikation muss einen Pool an wiederverwendbaren TCP Verbindungen verwalten, welche für den Datenzugriff auf das Backend verwendet werden. Nun ist es ja so, dass bspw. bei der Verwendung von Sessions immer nur ein Request zur gleichen Zeit bearbeitet werden kann (also nicht parallel) was in unserem Fall eine nicht hinnehmbare Performance zur Folge hat. Wenn nun aber einzelne (parallele) Request eine solche TCP Verbindung benötigen, muss dessen Zugriff ja synchronisiert werden. Ich frage mich nun, ob es eine Möglichkeit gibt, dies zu verhindern, bspw. durch den Einsatz von einem bestimmten Filder oder ähnlichem?

Beste Grüsse

Also, dass die Sessions immer nur ein Request parallel behandeln können, stimmt so nicht. Macht auch absolut keinen Sinn. Eine Webanwendung hat immer mehrere Threads - und die können auch von dem ein und dem selben Nutzer kommen. Zudem gibt es in 99% der Fälle bessere Lösungen, als irgendwas in einer Session zu speichern.

Was Du mit wiederverwendbaren TCP Verbindungen meinst; da kann ich Dir ehrlich gesagt gerade nicht folgen.
Erklär mal genauer, was Du meinst, dann kann man Dir vielleicht helfen.

@Abt
Ich muss es natürlich noch präzisieren, ich meinte mehrere Requests von demselben Benutzer können nicht parallel ausgeführt werden, weil sonst die Session Daten korrumpiert werden könnten. ASP wird solche Request nacheinander ausführen, was einen enormen Performanceverlust nach sich ziehen kann (und in unserem Fall auch tut).

Also ich hab einen Applikationesserver mit einem RPC Interface, welches eine TCP/IP Verbindung erfordert. Nun muss sich die Webapplikation sagen wir mal (100x) als Client bei diesem Applikationsserver anmelden und die TCP/IP Verbindungen offenhalten und verwalten. Wenn nun ein WebRequest reinkommt, welches Daten von diesem Applikationsserver benötigt, soll eine bestehende solche TCP/IP Verbindung aus diesem Pool benutzt werden (anstatt jedes Mal eine neue Verbindung herzustellen und anschliessend wieder zu beenden). Der Zugriff auf diesen Pool muss aber natürlich synchronisiert werden, weil ansonsten bspw. plötzlich mehrere (parallele) Webrequests dieselbe TCP/IP Verbindung zum Applikationsserver benutzen wollen, was nicht vorhersehbare Folgen hätte.

Und warum muss sich die Webanwendung um das Offenhalten der TCP-Verbindungen kümmen? Denkbar wäre doch auch ein separater Dienst, der sich um die TCP-Verbindungen und das Pooling kümmert - und die Webanwendung kommuniziert dann mit diesem Dienst.

So sehe ich das auch. Eine Webanwendung darf sich um so etwas nicht kümmern müssen. Es sind immer mehrere Threads - das wirst Du nie verhindern können. Das macht der IIS, nicht die Webanwendung.
Alles was innerhalb eines Requests geöffnet wird, SOLLTE auch innerhalb dieses Request beendet werden. Hierzu gehören zB auch Datenbankverbindungen. So etwas darf man niemals über mehrere Requests teilen - das ist die Natur der Sache.

Besondere, längere Dinge sollte man in einen separaten Thread auslagern, wobei dieser eine Verbindung zu einem (Nested-)Singleton hat, um ihn wieder finden zu können.
Wenn Du eine Webanwendung plötzlich synchron haben willst, hast Du den Sinn einer Webanwendung definitiv nicht verstanden.