Wie behandelt ein Server Web-Service-Anforderungen von mehreren Clients?

8

Ich habe gerade eine Android-Anwendung abgeschlossen, die Web-Services für die Verbindung mit einer entfernten Datenbank verwendet. Ich arbeitete an localhost.

Nun plane ich, meine Webdienste auf einem Server zu hosten. Nehmen wir an, ich habe meine Android-Anwendung auf einer beliebigen Anzahl verschiedener Client-Smartphones installiert. Jeder Smartphone-Benutzer ruft gleichzeitig den Web-Service an.

Wie geht der Server nun mit diesen Anfragen um? Führt es einen Thread pro Anfrage aus? Ich möchte im Detail über die Server-Verarbeitung erfahren. Wenn man bedenkt, dass alle Telefone GPRS verwenden, wird es in einer solchen Situation irgendwelche Verzögerungen geben?

Übrigens sind meine Webdienste SOAP-basiert und der Server, den ich später verwenden möchte, ist ein SQL Server. Ich habe .NET Framework zum Erstellen von Web-Services verwendet.

    
Parth Doshi 26.11.2011, 13:58
quelle

3 Antworten

6

Es ist für das allgemeine Konzept, nicht ein Android-spezifisch

Normalerweise sendet jeder Benutzer eine HTTP-Anforderung für die Seite. Der Server empfängt die Anforderungen und delegiert sie an verschiedene Worker (Prozesse oder Threads).

Abhängig von der angegebenen URL liest der Server eine Datei und sendet sie an den Benutzer zurück. Wenn es sich bei der Datei um eine dynamische Datei wie eine PHP-Datei handelt, wird die Datei ausgeführt, bevor sie an den Benutzer gesendet wird.

Sobald die angeforderte Datei zurückgeschickt wurde, schließt der Server die Verbindung normalerweise nach ein paar Sekunden.

Sehen Sie sich Funktionsweise von Web-Servern an

BEARBEITEN:

Bei HTTP wird TCP verwendet, bei dem es sich um ein verbindungsbasiertes Protokoll handelt. Das heißt, Clients stellen eine TCP-Verbindung her, während sie mit dem Server kommunizieren.

Mehrere Clients dürfen sich gleichzeitig auf demselben Zielcomputer mit demselben Zielport verbinden. Der Server öffnet einfach mehrere gleichzeitige Verbindungen.

Apache (und die meisten anderen HTTP-Server) haben ein Multi-Processing-Modul (MPM). Dies ist verantwortlich für die Zuordnung von Apache-Threads / -Prozessen zur Verarbeitung von Verbindungen. Diese Prozesse oder Threads können dann parallel auf ihrer eigenen Verbindung laufen, ohne sich gegenseitig zu blockieren. Apache's MPM neigt auch dazu, "freie" Threads oder Prozesse offen zu halten, selbst wenn keine Verbindungen offen sind, was nachfolgende Anfragen beschleunigt.

Hinweis:

Eines der häufigsten Probleme beim Multithreading ist "race conditions" - , wo zwei Anfragen dasselbe tun ("racen", um das Gleiche zu tun), wenn dies der Fall ist eine einzige Ressource, eine davon wird gewinnen. Wenn beide einen Datensatz in die Datenbank einfügen, können sie nicht beide die gleiche ID erhalten - einer von ihnen wird gewinnen. Sie müssen also vorsichtig sein, wenn Sie Code schreiben, um zu erkennen, dass andere Anfragen gleichzeitig ablaufen und Ihre Datenbank verändern, Dateien schreiben oder globale Variablen ändern können.

    
user370305 26.11.2011, 14:22
quelle
3

Der Server verwaltet einen Thread-Pool, der auf eingehende Anforderungen wartet. Nach dem Empfang einer Anfrage verarbeitet der Thread die Anfrage und gibt die Antwort zurück. Wenn alle Anforderungen gleichzeitig empfangen werden und sie weniger als die maximale Anzahl von Threads in dem Pool aufweisen, werden sie alle Dienste parallel sein (obwohl die tatsächliche Verarbeitung basierend auf der Anzahl der Kerne / CPU verschachtelt wird). Wenn mehr Anforderungen als Threads vorhanden sind, wird die Anforderung in die Warteschlange gestellt (Warten auf eine Verbindung), bis entweder ein Thread freigegeben wird oder die Clientanforderung eine Zeitüberschreitung aufweist.

Wenn Sie eine Verbindung mit dem Dienst über ein mobiles Netzwerk herstellen, ist die Latenz in der ersten Verbindung höher, reicht aber nicht aus, um etwas zu bewirken.

    
Chris 26.11.2011 14:12
quelle
2

Ihre Frage bezieht sich nicht wirklich auf Android, sondern auf die mobile Entwicklung mit dem Web-Backend.

Ich kann .NET nicht für die Server-App-Entwicklung verwenden, aber wenn Sie das Beispiel eines Apache / PHP / MySQL nehmen, werden alle Anfragen in einem getrennten Thread ausgeführt.

Es kann zu Verzögerungen bei der Latenz kommen, während die Anfrage den Server erreicht, dies sollte jedoch nicht die Zeit beeinträchtigen, die Ihr Server benötigt, um die Anfrage und die Daten zu verarbeiten.

Eines der Dinge, über die Sie nachdenken sollten, ist zu vermeiden, dass mehrere Anfragen von demselben Kunden gesendet werden. Dies ist ein häufiges Implementierungsproblem: Da keine Daten bereits zurückgegeben wurden, denken Sie, dass keine ausstehende Anforderung vorliegt und Sie eine neue Anforderung starten. Dies kann zu einer unnötigen Belastung Ihres Servers führen.

Hoffe das hilft!

    
AsTeR 26.11.2011 14:10
quelle