Vor- / Nachteile zwischen der Betonung der clientseitigen oder serverseitigen Verarbeitung


20

Warum sollte ich eine Web-App mit vielen Verarbeitungsservern schreiben wollen?

Das Schreiben des Programms auf der Client-Seite ist für mich ein großer Vorteil, da so viel Serverlast wie möglich eingespart wird, da nur mit minimalem Verarbeitungsaufwand Daten an den Client gesendet werden müssen.

Beim Schreiben von Web-Apps sehe ich sehr wenig, außer dass sie serverseitig geschrieben und clientseitig nur als Ansicht behandelt werden . Warum sollte ich das jemals tun wollen? Der einzige Vorteil, den ich sehe, ist, dass ich in jeder gewünschten Sprache schreiben kann ( http://www.paulgraham.com/avg.html ).


Es ist völlig in Ordnung, den größten Teil Ihrer Verarbeitung dem Client zu überlassen und nur das absolut Notwendige dem Server zu überlassen. Aus den in den Antworten genannten Gründen sollte hauptsächlich eine zusätzliche Datenvalidierung (getrennt von der clientseitigen Validierung) und Sicherheit serverseitig implementiert werden.
Sakisk

Ein Punkt, über den man nachdenken sollte, ist das Debuggen, was meiner Meinung nach auf dem Server normalerweise komfortabler ist. Das gleiche gilt für die Protokollierung.
Traubenfuchs

Ich stimme nicht zu, dass das Schreiben von Web-Apps nur als serverseitiges Senden einer Ansicht beschrieben wird. Schauen Sie sich das Aufkommen von Frameworks wie Vue, Angular usw. an, um vollständige Anwendungen auf dem Client zu erstellen und nur Daten mit dem Server auszutauschen.
Kwebble

Antworten:


28

Es gibt zwei Hauptprobleme.

  1. Das erste ist einfach: Sie wissen normalerweise nicht, welche Ressourcen auf der Clientseite verfügbar sind. Wenn es 1,5 GB erfordert, um etwas zu verarbeiten, können Sie das wirklich auf einen unbekannten Client-Browser (IE, Safari, Opera, Firefox usw.) auf einer unbekannten Client-Plattform übertragen? Wird der Kunde sein System zu schätzen wissen, wenn Sie es überwältigen?

  2. Die zweite ist eher architektonisch - welche Ebenen möchten Sie der Außenwelt aussetzen? Die meisten würden zustimmen, dass es unglaublich riskant ist, Ihre Datenschicht freizulegen. Wie wäre es mit Ihrer Service-Schicht? Möchten Sie diese Logik wirklich veröffentlichen? Wenn ja, machen Sie die Einstiegspunkte auch für Ihre Datenschicht verfügbar? Wenn Sie die Service-Layer-Serverseite beibehalten, was bleibt dann übrig? Die Benutzeroberfläche, richtig? In Grund 1 finden Sie Überlegungen dazu, wie viel davon auf dem Server und wie viel auf dem Client vorhanden ist.


1
+1 zum Ausblenden der Ebenen. SQL-Injection in den Sinn kommt ...
JMQ

7
Ich glaube nicht, dass SQL-Injections etwas damit zu tun haben, den größten Teil Ihrer Logik auf die Clientseite zu verlagern. Selbst wenn Sie die Datenverarbeitung auf die Clientseite verlagern, benötigen Sie dennoch einen serverseitigen Dienst, der SQL-Abfragen ausführt (es sei denn, Sie möchten Ihren Datenbankbenutzernamen und Ihr Kennwort öffentlich machen). Dieser Dienst ist für die Validierung und das Entweichen von Daten verantwortlich. Da gibt es keinen Unterschied - Sie MÜSSEN Eingaben auf Ihrer Serverseite IMMER validieren und ignorieren. Daran führt einfach kein Weg vorbei.
Pijusn

16

In erster Linie ist Sicherheit . Schieben Sie all Ihre Logik auf den Client und es ist ein faires Spiel für Hacker und Exploits.

Alles mit irgendeinem wahrgenommenen Wert wird nicht 5 Minuten dauern, insbesondere der Geldwert, und wird gespielt oder gehackt oder ausgenutzt und Ihr System wird ziemlich schlimm beschädigt. Auch wenn es wenig bis gar keinen Geldwert hat, gibt es eine Klasse von Leuten, die es hacken, nur um Ihr System zu zerstören, weil sie gelangweilt sind.


1
"Gelangweilt" ist wahrscheinlich eine Übertreibung. Viele Hacker hacken einfach, um einen Punkt zu machen oder den Entwickler zum Narren zu halten. Eine Art "Ihr Code ist schlecht und Sie sollten sich schlecht fühlen" -Mentalität. Nicht zu sagen, dass Hacks "aus Langeweile" niemals stattfinden, aber ich denke nicht, dass das extrem häufig ist.
die maus

@Jarrod - können Sie erläutern, wie schlecht die Implementierung der Logik auf der Clientseite aus Ihrer Sicht ist?
Simple-Solution

@ Simple-Solution, wenn Sie diese Frage stellen müssen ...

7

Clientseite versus Serverseite

Die clientseitige Verarbeitung entspricht den gängigen REST-Standards sowie MVC im Gegensatz zu seitenbasierten Ansätzen und SOAP. Mit dem Aufkommen dieser Trends und dem Fokus auf AJAX und Html-RIA wird clientseitiges Scripting immer beliebter. Aufgrund von Sicherheitsbedenken und Clientfähigkeiten hat clientseitiges Scripting jedoch eine bestimmte Nische und sollte nicht für alle Zwecke verwendet werden.

Überlegungen:

Handy, Mobiltelefon

Wenn ein großer Teil Ihrer Zielgruppe mobile Benutzer sind, sollte die Verarbeitung dem Server überlassen werden.

Browserübergreifende Konsistenz

Webstandards haben einen langen Weg zurückgelegt, und dies ist möglicherweise kein so großes Problem, aber jeder Webentwickler weiß, dass IE 6,7 und 8 und manchmal Safari auf der Clientseite lustig sein können - bestimmte Funktionen werden möglicherweise aufgrund von nicht ausgeführt Sicherheitsbeschränkungen und andere aufgrund nicht implementierter Standards. Es ist auch wichtig zu beachten, dass der Endbenutzer einen Browser so konfigurieren kann, dass er bestimmte Einschränkungen hat oder sogar die clientseitige Verarbeitung vollständig ausschaltet (kein Javascript!). Wenn für 100% der Benutzer Konsistenz erforderlich ist (und insbesondere, wenn Sie etwas Unorthodoxes tun), ist die Serverseite am wichtigsten.

Sicherheit

Alle Datenmanipulationen, die Sie sichern möchten, müssen auf dem Server ausgeführt werden. Alle Daten, die auf der Client-Seite verarbeitet werden, sind absolut manipulationssicher. Wenn Sie beispielsweise über eine Javascript-Funktion verfügen, die einige Informationen verarbeitet, die dann zurück ins System gesendet werden, ist es sehr einfach, das Ergebnis zu bearbeiten, bevor es zurück gesendet wird, selbst wenn Sie über eine beispielhafte Back-End-Sicherheit verfügen

UI / UX

Die clientseitige Verarbeitung bleibt für die Benutzeroberfläche und das Erstellen von Rich-Internet-Anwendungen (RIAs) übrig. Es wird zum Erstellen von Animationen, Effekten und Benutzerinteraktionen sowie zum dynamischen Laden von Inhalten über AJAX-Aufrufe verwendet, anstatt eine ganze Seite neu zu laden.


6

In erster Linie wird es eine Doppelarbeit sein. Höchstwahrscheinlich werden alle Daten vom Client erneut auf Serverebene überprüft und verarbeitet.

Der Server kann nicht davon ausgehen, dass Ihr Rich / Robust-Client die Daten gesendet hat. Wenn also Daten gesendet werden, muss der Server diese validieren und verarbeiten. Es macht also Sinn, es dort abzulegen.

Ich glaube jedoch, dass auf Client-Ebene eine gewisse Logik für eine bessere Benutzeroberflächenerfahrung durchgeführt werden kann.

Sie haben Recht, warum Daten an den Server gesendet werden, wenn sie nicht vollständig oder falsch sind. Es ist einfach, nach erforderlichen Feldern oder nach richtig formatierten Telefonen oder E-Mail-Adressen zu suchen. Ich habe es nie gemocht, ein Formular abzusenden und dann 5 Sekunden darauf zu warten, dass ich vergessen habe, ein Feld einzugeben. Diese Art der Verarbeitung muss auf dem Client ausgeführt werden. Stellen Sie sicher, dass sie korrekt ist und die clientseitige Logik verwendet, um dem Benutzer eine schnelle Antwort zu ermöglichen. Wie Sie bereits erwähnt haben, besteht ein zusätzlicher Nebeneffekt darin, dass Ihr Server mit weniger schlechten Datenanforderungen fertig werden muss. ABER der Server muss auch noch validieren, damit Sie die Logik täuschen. Aber Ihre Benutzer werden glücklicher sein.

Hier gibt es eine feine Linie. Einfache Validierungslogik OK, Kerngeschäftslogik nicht OK.


4
  1. Zunächst müssen Sie die Architektur von Webanwendungen verstehen. Die meisten, wenn nicht alle, sind dreistufig:

    a) Client / Präsentation - HTML und Javascript können ActiveX / Flash / Java Applets / Silverlight enthalten. Ich werde in Ruhe native mobile Anwendungen hinzufügen, die mit einem Back-End-Server kommunizieren. Grundsätzlich besteht die Aufgabe dieser Schicht darin, dem Benutzer des Systems eine Schnittstelle zur Interaktion mit ihm bereitzustellen.

    b) Geschäftslogik - PHP / RoR / Java, in der die Daten vom Kunden gesammelt, verarbeitet und gespeichert werden und in der Kundenanforderungen für Daten verarbeitet und an den Kunden zurückgesendet werden

    c) Backend-Datenspeicher - Bietet dauerhaften Speicher für die Systeminformationen

  2. Wo führen Sie die Validierung in allen Ebenen durch? Warum?

    a) Clientseitig - Stellen Sie sicher, dass der Benutzer die richtigen Daten, erforderlichen Felder usw. eingibt

    b) Geschäftslogik - Filtern, Bereinigen und Validieren von Kundendaten. Führen Sie komplexere Geschäftsregeln aus, um sicherzustellen, dass die Daten für die Speicherung korrekt formatiert sind. Ein Teil der am Frontend durchgeführten Validierung wird hier wiederholt, da es möglicherweise unterschiedliche Clients gibt, z. B. Browser, bei denen Javascript deaktiviert werden kann. Es kann auch Daten aus verschiedenen Quellen über APIs akzeptieren, sodass alle validiert werden müssen.

    c) Back-End-Datenspeicher - Einschränkungen stellen sicher, dass die Daten für das Speichern und spätere Abrufen gut strukturiert sind.

Wo konzentrieren Sie sich also auf Ihre Validierungsbemühungen? Verwenden Sie jede Ebene, um die am besten geeignete Validierung durchzuführen, und belassen Sie komplexere Regeln für die Ebene, die damit umgehen kann


3

Ein großer Teil ist es, Ihre Verarbeitung nah an Ihren Daten zu halten. Wenn Sie Hunderte von GB Daten haben, werden Sie diese offensichtlich nicht an einen Kunden versenden. Mit zunehmender Datenzugriffsgeschwindigkeit wird dies immer weniger ein Problem. Wenn Sie jedoch eine Big-Data-Site haben, möchten Sie den Server vor der Auslieferung so oft filtern und einschränken, wie Sie können.


1

Wenn Sie Ihr Verhalten vollständig auf der Client-Seite erstellen (z. B. mit Javascript), kann SEO zum Problem werden.

Weblösungen, die viel auf dem Server haben, können bestimmte Inhalte leichter auf einer bestimmten URL (normalerweise RESTful) veröffentlichen, sodass sie für Suchmaschinen sichtbar sind.

Dies bedeutet auch, dass ein Besucher eine bestimmte Seite mit einem Lesezeichen versehen kann. Hast du das schon auf Facebook versucht?

Dieses Problem kann gelöst werden, es ist jedoch normalerweise in Anwendungen integriert, die viel auf dem Server leisten (RAILS, WordPress usw.). Wenn Sie jedoch REACT einbauen, müssen Sie durch die Rahmen springen.


0

Der Grund ist Stabilität .

Auf der Serverseite kann ich stabile Komponenten auswählen. Normalerweise bedeutet dies, dass ich mich für Java und eine Reihe sehr sorgfältig ausgewählter Bibliotheken wie FreeMarker entscheide. Selbstverständlich wird jede Bibliothek außer den Standardbibliotheken von Java als Einwegbibliothek behandelt, sodass ich über einen selbst erstellten Wrapper auf die externen Bibliotheken zugreifen kann. Dies bedeutet, dass ich bei Bedarf problemlos von einer Bibliothek in eine andere wechseln kann.

Jedes Mal, wenn ich Java auf eine neue Version aktualisiere, funktioniert dies normalerweise gut, da Java eine äußerst stabile Komponente ist, selbst bei größeren Versionsaktualisierungen. Außerdem läuft auf jedem Server die gleiche Java-Version. Nicht auf jedem Client wird dieselbe JavaScript-Implementierung ausgeführt.

Auf der Clientseite kann ich keine stabilen Komponenten auswählen. Die Browser-Hersteller werden mich zwingen, JavaScript zu wählen, eine Sprache, die ich nicht besonders mag, aber die ich zwingen muss. (Und erzähl mir nichts über Sprachen, die mit JavaScript kompiliert wurden, sie sind schrecklich!) Die JavaScript-Implementierung jedes Browsers ist anders. Das heißt, es ist eine Hölle, mein Produkt mit jeder unterstützten Browserversion zu testen.

Meine Lösung? Ich führe auf der Serverseite so viel Verarbeitung wie möglich durch, und auf der Clientseite handelt es sich nur um einen kompakten Wrapper, der Daten an den Server sendet und Daten vom Server in Form von JSON- und HTML-Fragmenten empfängt. Vermeiden Sie XML. Verwenden Sie stattdessen JSON.

Ich mache kein clientseitiges Templating. Ich rendere den Inhalt auf dem Server zu einem HTML-Fragment, das ich dann mit der.innerHTML Attributs verschiedenen Platzhalterelementen auf der Clientseite zuordnete. Dies hält den Technologie-Stack so einfach wie möglich, da ich keine zwei Template-Engines benötige (eine Java- und eine JavaScript-Engine).

Der Nachteil ist offensichtlich die Lichtgeschwindigkeits-Latenzzeit; Eine halbe Sekunde Latenz ist zwischen den Kontinenten keine Seltenheit.

Denken Sie daran, dass Ihre Kunden heutzutage möglicherweise Smartphones sind. Smartphones haben eine begrenzte Akkulaufzeit. Wenn Sie also viel rechnen, sollten Sie sie besser auf Ihre Server auslagern. Einfache Dinge können jedoch energieeffizienter sein, wenn sie auf der Clientseite ausgeführt werden, da Sie dann den Funkzugriff vermeiden können. Aber das Hauptargument, Stabilität, kann bedeuten, dass es tatsächlich Sinn macht, auch einfache Berechnungen auf den Server zu verlagern.

Als Ergänzung erhalten Sie, wie in einigen Antworten bereits erwähnt, auch Sicherheit . Wenn die Anwendungslogik vollständig auf der Clientseite liegt, kann jemand z. B. einen Preis für das festlegen, was er in Ihrem Online-Webshop kaufen möchte.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.