Gehört Geschäftslogik wirklich auf den Server?

10

Ein typischer Stapel für eine Webanwendung ist eine Datenbank, ein Server mit serverseitigem Code und ein Benutzer mit einem Browser mit HTML / CSS / JavaScript.

Vor umfangreichem AJAX wurde MVC, in dem der Controller der serverseitige Code war, gerullt. Ein Server musste Antwortanfragen für dynamische Webseiten weiterleiten (dh HTML-Lösungen mit Vorlagen wie JSP und ASP). Der Server koordiniert die Aufrufe der Datenbank und entscheidet, welche dynamische Seite zur Beantwortung der Seitenanforderung verwendet wird. Das Ergebnis all dessen ist, dass der Server letztendlich die Geschäftslogik enthielt, obwohl die Geschäftslogik nicht stark an die Idee gebunden ist, Seiten bereitzustellen.

Jetzt, da wir auf "Web 2.0" umsteigen, werden auf einem Server statische Seiten angezeigt, die JavaScript verwenden, um sich selbst zu füllen und die Darstellung zu ändern. Das kann im JavaScript sein. Das JavaScript implementiert häufig einen RESTful-Service, dh es gibt eine Datenbankabfrage an.

Der Server bleibt also den Aufgaben überlassen, die tatsächlichen Dateien bereitzustellen und AJAX-Anrufe zu beantworten. Das Beantworten von AJAX-Anrufen ist lediglich Sitzungsverwaltung und bietet Sicherheit. Und tatsächlich sollte ein Benutzer sogar Daten sehen können, die in der Datenbank angegeben werden sollten.

Sollte der Server von dort aus in die Rolle eines dummen Vermittlers verwiesen werden, der nur gelegentlich so etwas wie das Versenden einer E-Mail oder das Auslösen eines Webservices ausführt? Könnte Geschäftslogik alle in JavaScript leben (wenn es nicht geheim ist) oder in gespeicherten Prozeduren leben, wenn es ist?

Ist es sinnvoll, vielleicht sogar Server und Datenbanken zu kombinieren oder ERP-Lösungen wie SAP als Server zu fungieren?

Joe
quelle

Antworten:

14

Aus Sicherheitsgründen muss die Geschäftslogik fast immer auf einem Server ausgeführt werden, den Sie steuern. Wenn Sie mit "Server" "Webserver" meinen, dann stimme ich zu, dass es fast keine Geschäftslogik geben muss. Sie benötigen jedoch fast immer einen Anwendungsserver mit der Geschäftslogik, unabhängig davon, ob dieser sich in einer Datenbank oder einem Webserver befindet oder separat ist und vom Webserver aufgerufen wird.

Es gibt reale Anwendungen, bei denen der Webserver nur die API des Anwendungsservers über Webdienste oder JSON verfügbar macht.

Schon vor Web 2.0 und AJAX galt es nicht als bewährte Methode, Ihre Geschäftslogik mit ASP-Seiten zu mischen. Es wurde als besser angesehen, eine unabhängige Geschäftslogik zu haben und den Serverteil der Präsentationslogik in ASP, JSP oder was auch immer zu haben. Die eigentliche Änderung gegenüber Web 2.0 besteht also darin, dass die Präsentationsschicht vollständig in Javascript ausgeführt werden kann. Ich persönlich bevorzuge das irgendwie.

psr
quelle
Ja, ich stimme zu, dass Geschäftslogik nicht in einem ASP enthalten sein sollte. Das ist der Punkt von MVC.
Joe
Diese Antwort stammt von vor fast zwei Jahren, und jetzt liegen Dinge wie SproutCore voll im Trend. Auf der SproutCore-Website wird ausdrücklich angegeben, dass das Ziel darin besteht, die Geschäftslogik in den Browser zu verschieben (siehe: sproutcore.com/about ). Also ... hat sich der Zustand des Webs jetzt geändert? Ist die Geschäftslogik auf dem Client (insbesondere über JS im Browser) in Ordnung oder vielleicht sogar vorzuziehen?
JoeCool
@ JoeCool SproutCore gab es damals. Die Sicherheitsaspekte beim Aufbringen der Geschäftslogik auf den Client haben sich nicht geändert. Aber nicht alle Anwendungen haben viele Sicherheitsbedenken. Außerdem scheint "all the rage" für SproutCore ziemlich übertrieben. Die Machbarkeit, mehr auf dem Client zu tun, hat jedoch weiter zugenommen - mit der Ausnahme, dass mobile Geräte immer mehr an Bedeutung gewonnen haben und hinsichtlich der Leistung für viele Anwendungen weiterhin eine Herausforderung darstellen.
Psr
@psr Zugegeben - aber Sie schienen die Verwendung der Geschäftslogik im Client völlig zu unterbinden, obwohl tatsächlich zumindest einige beliebte Technologien heutzutage deutlich in diese Richtung gehen.
JoeCool
6

Das JavaScript implementiert häufig einen RESTful-Service, dh es gibt eine Datenbankabfrage an.

Hier hast du es falsch verstanden. REST ist nicht CRUD.

Die von REST bereitgestellten Ressourcen sind nicht Ihre Datenbankeinträge. Es handelt sich um vollständig verwaltete Objekte, die sich gemäß Ihrer Geschäftslogik verhalten. Wenn der Server einen POST oder PUT empfängt, sollte er nicht nur validieren und speichern. Es muss alles ausführen, was für die Anwendung geeignet ist.

Einfaches Beispiel: Eine Twitter-ähnliche App empfängt Tweets als POST-Nachrichten auf einem bestimmten Container. Der Server analysiert dann den Kontext ("Wer bist du?", "Welcher Kanal ist das?") Und den Inhalt ("Irgendwelche Hashtags?", Textindizes usw.) und speichert dies alles in den jeweiligen Warteschlangen. Fügt wahrscheinlich einen Verweis direkt auf alle Ihre Follower hinzu.

Das ist eine Menge Arbeit, die über das einfache Hinzufügen der Ressource zum Container hinausgeht. Alles wird durch Ihre Geschäftslogik definiert. Und es gehört auf den Server.

Javier
quelle
2

Meine Bedenken hinsichtlich dieses Ansatzes können auf ein Missverständnis Ihres Designs zurückzuführen sein. Sie können mich also gerne abschießen.

Denken Sie jedoch an die Skalierbarkeit, Wartbarkeit und Sicherheit des Produkts.

Wenn Ihr Produkt massiv wächst, wird die Datenbank zum Engpass. Während "Leistung" vorschlägt, Geschäftslogik in gespeicherte Prozeduren zu integrieren, wird Ihr Datenbankserver zusätzlich mit CPU belastet, was den Tag vorverlegt, an dem der Server die maximale Kapazität erreicht. Im Gegensatz zu Webservern lassen sich ACID-Datenbanken mit paralleler Hardware nicht einfach skalieren. Wenn Ihr Produkt niemals so erfolgreich sein wird, ist dies kein Problem.

Der Gedanke, die Geschäftslogik in Javascript beizubehalten, das auf Webbrowsern ausgeführt wird, in denen verschiedene Browser unterschiedliche Javascriopt, mehrere Browserversionen usw. erfordern. Warum sollte dieses Problem komplizierter sein als es bereits ist?

Wie Javiar bereits sagte, ist die Verwendung eines REST-Ansatzes als Datenbank-API für Ihr Produkt wirklich nicht sinnvoll. Ein Vorteil einer REST-Schnittstelle besteht darin, dass andere Personen dann über verschiedene Möglichkeiten nachdenken, Ihre REST-Schnittstelle zu verwenden und abzufragen. Dies sind jedoch öffentliche Post-Business-Logikressourcen und keine Ressourcen für Tabellendatensätze auf niedriger Ebene. Der Gedanke, solche Datenabfragen auf niedriger Ebene über die HTTP-API verfügbar zu machen, klingt nach einem Sicherheitsalptraum.

Michael Shaw
quelle
+1, um das Problem mit der Browserkompatibilität zu bestechen. Das Schreiben von Geschäftscode in JavaScript erfordert zusätzliche Fähigkeiten und lässt Sie keine Methoden in Ihren Geschäftsklassen verwenden.
NoChance
2

Zwar gibt es viele Denkschulen, und sicherlich kann kein Weg allgemein als "der richtige Weg" bezeichnet werden, während alle anderen allgemein als "der falsche Weg" bezeichnet werden. Es gibt jedoch eine Reihe von Gründen, die Geschäftslogik auf der Serverseite zu isolieren und Zugriff auf diese Objekte und Dienste über einen RESTful-Dienst.

Die kurze Antwort lautet, dass es hauptsächlich um Risikomanagement sowie Leistungsüberwachung und -verbesserung geht.

Im Detail:

Der Hauptgrund Nummer 1 ist die Sicherheit. Den Kunden sollte niemals vertraut werden, dass sie etwas anderes als Müll an den Server senden. Wenn Sie die Sicherheitsaspekte auf der Serverseite beibehalten, können Sie das potenzielle Risiko eines betrügerischen Benutzers, der Ihr System beschädigt, eingrenzen. Denken Sie daran, dass Javascript vollständig clientseitig und trivial veränderbar ist, sodass Sie dem Ergebnis nicht vertrauen können.

Der Hauptgrund Nummer 2 ist die Trennung von Bedenken. Ihr Javascript-Programmierer ist möglicherweise kein Experte für Sicherheit, und Ihr Sicherheitsguru ist möglicherweise nicht so gut in Javascript. Indem Sie die Geschäftslogik von der Präsentationslogik isolieren, vermeiden Sie, diese Bedenken zu überschreiten, da das Javascript nicht auf Ressourcen zugreifen darf, die über seine Berechtigungsstufen hinausgehen, und Fehler erhalten, deren Behandlung im Rahmen des Skriptprogrammierers liegt. Ebenso wird der Sicherheitsmann kein Javascript debuggen, um zu sehen, wie die Sicherheit aufrechterhalten wird.

Der Grund Nummer 3 ist die Leistung. Geschäftslogik kann möglicherweise Server- und Datenbankressourcen beanspruchen. Indem Sie diese Logik von Ihren UI-Elementen isoliert halten, können Sie nur diesen Teil Ihrer Anwendung skalieren, wodurch Engpässe viel einfacher behoben werden können. Darüber hinaus ist es viel einfacher zu isolieren, welcher Geschäftsprozess Ihr System- oder Datenbank-Backend lädt, wenn die Geschäftsprozesse auf dem Server ausgeführt werden.

Eine Folge davon ist, dass häufig mehrere Geschäftsprozesse dieselben Daten verwenden. Daher können Sie das Caching auf der Serverseite implementieren, um die Gesamtsystemlast zu reduzieren, die möglicherweise nicht möglich / sicher ist, um clientseitigen Codezugriff zu ermöglichen.

Schließlich würde ich vorschlagen, dass Business Logic wirklich auf dem Server sein muss, um die ACID-Standards aufrechtzuerhalten. Ich erinnere mich, dass ich ein Abrechnungsprodukt gepflegt habe, das im Webbrowser ausgeführt wurde und nur eine Datenbankverbindung zum Server hatte. Wenn die tägliche Abrechnung (die an einem guten Tag eine Stunde oder länger dauern kann!) Unterbrochen wurde, z. B. weil der Browser geschlossen wurde oder abstürzte, konnte es mehrere Stunden dauern, bis das Chaos in der verbleibenden Datenbank behoben war in einem inkonsistenten Zustand. Denken Sie daran, dass dies auch Kreditkarten betraf, sodass die Abrechnungsunterlagen auch mit dem Verarbeiter verglichen werden mussten!

Die serverseitige Geschäftslogik ist meistens trivial, um ACID-Aktualisierungen sicherzustellen, da es Frameworks für jede Sprache gibt, um Transaktionen entweder auf Anwendungs- oder Datenbankebene zu verwalten. Wenn Sie dies über mehrere Updates von einem Webclient tun, erhalten Sie irgendwann einen inkonsistenten Status, der sich wahrscheinlich auf Ihre Anwendung auswirkt.

Während es verlockend sein kann, sich RESTful-Services einfach als eine Möglichkeit für den Zugriff auf die Datenbank vorzustellen, sollten Sie nicht in diese Falle tappen, da dies ein gutes Rezept für eine Katastrophe ist. Das Objektmodell, das Sie über einen RESTful-Service verfügbar machen, kann sich auf Ihre Datenbank beziehen, sollte jedoch Ihre Geschäftslogik wirklich kapseln, anstatt sie nur als CRUD-Engine zu verwenden.

SplinterReality
quelle
+1 für viele gute Punkte. Das Abrechnungssystem, das Sie als Beispiel verwendet haben, hat das seltsamste Design, von dem ich je gehört habe.
NoChance
Es hatte den seltsamsten Namen, von dem ich je gehört habe, obwohl ich immer noch Hinweise darauf sehe. Es hieß HURLnet ISP Admin und war ziemlich zu pflegen. Wir hatten eine vollständige Quellcodelizenz, und ich habe diese ausgiebig genutzt, als sie nicht mehr unterstützt wurden.
SplinterReality