Warum sollte ein Entwickler Webdienste anstelle von direkten Verbindungen zu einer Datenbank verwenden? [geschlossen]

92

Ich suche nach einer "Top Ten" -Liste mit Gründen, warum wir über einen Webdienst eine Verbindung zu entfernten Datenbanken herstellen sollten, anstatt eine direkte Verbindung zur Datenbank herzustellen. Dies ist derzeit eine interne Debatte, und ich bin ein Pro-Web-Dienst, verliere aber das Argument. Ich habe ein grundlegendes Verständnis für WCF / Webdienste, das sonst niemand tut. Wir können tun, was wir wollen, aber wir müssen bei dem bleiben, was wir jetzt wählen.

Folgendes habe ich mir ausgedacht. Nicht mehr?

  1. WCF-Webdienste können bei korrekter Konfiguration sicherer sein.
  2. Änderungen an der Datenbank müssen nur auf Serviceebene vorgenommen werden (Konfigurationsdatei oder Dienst neu kompilieren).
  3. Einmal eingerichtet und gehostet, sind Webdienste einfacher zu nutzen.
DenaliHardtail
quelle

Antworten:

120
  1. Sicherheit. Sie gewähren niemandem außer dem Webserver / App-Benutzer DB-Zugriff.

    Dies ist besonders wichtig, wenn Sie Tonnen von Benutzern haben. Sie vermeiden den Schmerz der Benutzer- / Rollenpflege auf der DB-Seite.

  2. DB Lastreduzierung. Der Webdienst kann die aus der Datenbank abgerufenen Daten zwischenspeichern.

  3. Pooling von Datenbankverbindungen (hat / tip @Dogs).

    Ein Webdienst kann einen kleinen Pool permanent geöffneter DB-Verbindungen verwenden. Das hilft auf verschiedene Weise:

    • Der DB-Verbindungspool ist auf der Seite des Datenbankservers begrenzt.

    • Das Öffnen einer neuen DB-Verbindung ist SEHR kostspielig (insbesondere für den Datenbankserver).

  4. Fähigkeit zur Fehlertoleranz - Der Dienst kann zwischen primären / DR-Datenquellen wechseln, ohne dass Details des Failovers von den Dienstkonsumenten implementiert werden.

  5. Skalierbarkeit - Der Dienst kann Anforderungen auf mehrere parallele Datenquellen verteilen, ohne dass die Dienstkonsumenten Details zur Ressourcenauswahl implementieren müssen.

  6. Verkapselung. Sie können die zugrunde liegende DB-Implementierung ändern, ohne die Benutzer des Dienstes zu beeinträchtigen.

  7. Datenanreicherung (dies umfasst alles von der Clientanpassung über die Lokalisierung bis zur Internalisierung). Grundsätzlich kann jede davon nützlich sein, aber jede von ihnen stellt eine große Belastung für die Datenbank dar und ist oft sehr schwer in einer Datenbank zu implementieren.

  8. Kann auf Sie zutreffen oder nicht - bestimmte Architekturentscheidungen sind nicht DB-zugänglich. Beispielsweise haben Java-Server, die unter Unix ausgeführt werden, einen einfachen Zugriff auf eine Datenbank, während ein Java-Client, der auf einem Windows-PC ausgeführt wird, weder datenbankbewusst ist noch dies möglicherweise möchte.

  9. Portabilität. Ihre Kunden befinden sich möglicherweise nicht alle auf derselben Plattform / Architektur / Sprache. Das Wiederherstellen einer guten Datenzugriffsschicht in jeder dieser Schichten ist schwieriger (da Probleme wie die oben genannten Failover / etc ... berücksichtigt werden müssen) als das Erstellen einer Consumer-Schicht für einen Webdienst.

  10. Leistungsoptimierung. Angenommen, die Alternative besteht darin, dass Clients ihre eigenen Abfragen ausführen (und keine vordefinierten gespeicherten Prozeduren), können Sie zu 100% sicher sein, dass sie weniger als optimale Abfragen verwenden. Wenn der Webdienst die zulässigen Abfragen begrenzt, kann er die Datenbankoptimierung erheblich verbessern. Ich muss hinzufügen, dass diese Logik gleichermaßen auf gespeicherte Prozeduren anwendbar ist, nicht nur auf Webdienste.

Eine gute Liste finden Sie auch auf dieser Seite: 'Kapselung des Datenbankzugriffs: Eine agile "Best Practice"'

Nur um ganz klar zu sein - einige dieser Probleme sind möglicherweise nicht auf ALLE Situationen anwendbar. Einige Leute interessieren sich nicht für Portabilität. Einige Leute müssen sich keine Sorgen um die DB-Sicherheit machen. Einige Benutzer müssen sich keine Gedanken über die Skalierbarkeit der Datenbank machen.

DVK
quelle
26
Entschuldigung, nicht einverstanden. 1. Sie gewähren also DB-Zugriff auf eine Gruppe anstelle eines einzelnen Principals - kein Unterschied. 2. Jede App kann Daten zwischenspeichern. Die Art von Daten, die zwischen mehreren Benutzern zwischengespeichert werden können, sind normalerweise in jedem Fall Daten mit geringem Datenvolumen. 3. FT sollte in jedem Fall von der Datenbank verwaltet werden. 4. Dies ist keine sofort einsatzbereite Funktion und muss programmiert werden. 5. Ihre Datenzugriffsschicht sollte die Kapselung durchführen. 6. Das Gleiche. 7. Wirklich? JDBC läuft nicht in einem Client? 8. Guter Punkt, wenn es darauf ankommt, was selten ist. 9. Abfrage vs. SP war nicht Teil der Frage.
John Saunders
7
1. Versuchen Sie, dies über 5000 Benutzer mit Hunderten von Rollen zu verwalten. Skaliert nicht mehr so ​​gut. 2. Kommt ganz auf eine App an. In unserem aktuellen Fall werden die Ergebnisse einer Abfrage zwischengespeichert, deren Ausführung im überoptimierten Fall 20 Minuten dauert und die mindestens 100 Mal am Tag von verschiedenen Apps ausgeführt werden muss. 3. FT wird auf mehreren Ebenen gehandhabt. Was meinst du mit "sollte von einer Datenbank gehandhabt werden"?
DVK
4
4. Natürlich muss es programmiert werden. Es kann jedoch einmal in den Dienst oder in zig Client-Apps auf verschiedenen Plattformen mit unterschiedlichen Funktionen programmiert werden. Es gibt einen großen Unterschied. Beachten Sie die Probleme des Konfigurationsmanagements für den Lastenausgleich. 5. Gleiche Argumentation. Sie müssen DAL nicht erneut implementieren. In der Tat können Sie sich den Webdienst einfach als tragbaren DAL vorstellen, um Ihre Gedanken zu beruhigen. 7. Wir möchten nicht, dass jeder Client DB-Verbindungen öffnet. Ist das so eine große Frage? Auch hier vergessen Sie die Punkte 1-5.
DVK
2
8.> 1 Client-Architektur kommt SEHR häufig vor. Tatsächlich habe ich nie an einem Projekt ohne eine solche Situation in meinem Leben gearbeitet, aber ich konzentriere mich auf die Finanzwelt. 9. Es war nicht. Ich spielte im Grunde den Anwalt des Teufels.
DVK
2
Ich mag diese Antwort, aber ich denke, Sie haben einen der wichtigsten Punkte übersprungen: Verbindungspooling. Wenn Sie 1.000.000 Clients haben, haben Sie entweder 1.000.000 offene Verbindungen oder Millionen von Verbindungen, die ständig geöffnet und geschlossen werden. Die grundlegende Intuition über Computerorganisation sagt uns, dass ein gut abgestimmter Pool von ein paar hundert langlebigen Verbindungen astronomisch effizienter ist als eine Million langlebiger oder Millionen kurzlebiger Verbindungen. Die HikariCP dokumentiert eine großartige Arbeit bei der Ausarbeitung dieser Idee: github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing
Dogs
15

Meiner Meinung nach sollten Sie Ihre Datenbank nicht automatisch als Webdienst verfügbar machen. Wenn sich herausstellt, dass Sie einen Dienst benötigen, um Ihre Daten verfügbar zu machen, schreiben Sie einen, aber nicht der gesamte Datenbankzugriff sollte über Webdienste erfolgen.

  1. Es gibt keinen Grund, warum eine Datenbankverbindung nicht sicher sein sollte
  2. Sie können die Datenbank in einer Datenzugriffsschicht (möglicherweise Entity Framework) kapseln.
  3. Webdienste sind nicht einfacher zu nutzen als eine gut geschriebene Datenzugriffsschicht.
John Saunders
quelle
Warum unbedingt XML? Es gibt auch viel leichter, JSON, CSV für einfache flache Daten usw. zu analysieren ...
DVK
Es ist nicht "ohne guten Grund". Wie bereits erwähnt, kann dies abhängig von Ihren Anforderungen und Wünschen für die zukünftige Entwicklung für Ihr Projekt erforderlich sein.
Chris Stewart
Ich schreibe mein WS, um ein DAL zu konsumieren. Welchen Port würden Sie vorschlagen, um einen DAL freizulegen?
Samis
@samus es spielt keine Rolle.
John Saunders
"Es gibt keinen Grund, warum eine Datenbankverbindung nicht sicher sein sollte". Nun, es ist beispielsweise schwierig, die Verbindung zwischen einem Windows-Client und einer Datenbank zu sichern. Wirklich schwierig, eine sichere Verbindung zu implementieren!
NoChance
12
  • Web Services bilden eine API, die die zulässigen Interaktionen zwischen externen Systemen und den Daten der Anwendung definiert.
  • Web Services entkoppeln die Datenbank von externen Interaktionen und ermöglichen die Verwaltung der Datenschicht unabhängig von diesen äußeren Einflüssen.
  • Durch das Zulassen des Zugriffs nur für Webdienste wird sichergestellt, dass die Anwendungslogik ausgeführt werden kann, wodurch die Datenintegrität geschützt wird.
  • Mit Webdiensten können die am besten geeigneten Authentifizierungs- / Autorisierungsmaßnahmen ergriffen werden, im Gegensatz zu einer Datenbank, für die Berechtigungen auf Benutzername und Kennwort- / Tabellenebene erforderlich sind.
  • Webdienste bieten die Möglichkeit, die automatische Diensterkennung und -konfiguration zu verwenden.
  • Der Webdienstverkehr kann für die Übertragung über ungesicherte Netzwerke verschlüsselt werden. Sie kennen keine direkten DB-Verbindungslösungen, die dies ermöglichen ...?

Die meisten dieser Punkte gelten für jede formale API, nicht speziell für Webdienste.

Brabster
quelle
1
Ja, das wollte ich sagen, wenn Sie eine einzelne Anwendung haben, die auf eine Datenbank zugreift, sind alle Ihre Punkte auch für normale APIs verfügbar.
Ignacio Soler Garcia
"Web Services bilden eine API, die die zulässigen Interaktionen zwischen externen Systemen und den Daten der Anwendung definiert." Sie können dies auch mit einer Datenbank tun.
Schuh
"Durch das Zulassen des Zugriffs nur über Webdienste wird sichergestellt, dass die Anwendungslogik ausgeführt werden kann, wodurch die Datenintegrität geschützt wird." - Ich würde argumentieren, dass Datenintegrität nur Teil des DBMS sein sollte.
Schuh
@Shoe Es ist schön, so viel Integrität wie möglich durch die Datenbank zu erzwingen, aber wenn Daten anfangen, Mängel zu füllen und aufzudecken, wie die Notwendigkeit einer Eingabevalidierung, ist es schön, dies auf Anwendungsebene durchzusetzen (obwohl ich es vorziehen würde, dies auf der Ebene zu erzwingen Auf der Clientseite muss dies manchmal auf der Serverseite behandelt werden, wenn die Validierungsregeln von Daten abhängen, die nur dem Server bekannt sind (von der Client-App ferngehalten). Ist es eine große Sache, den Integritätsregelsatz einer DB zu ändern? Ich würde mir vorstellen, dass dies keine triviale Angelegenheit ist.
Samis
2

Das Schreiben eines Webdienstes, der Aufrufe an gespeicherte Prozeduren einfach umschließt, scheint ein fehlgeleiteter Ansatz beim Entwerfen eines guten DAL zu sein. Höchstwahrscheinlich handelt es sich bei Ihren gespeicherten Prozeduren um Legacy-Code, der von älteren Client-Server-Systemen übrig geblieben ist, dh Geschäftsregeln sind in den SPs vergraben. Wenn das der Fall ist, versuchen Sie wirklich, eine Seidenhandtasche aus dem Ohr einer Sau zu erstellen.

Darüber hinaus fügen Sie eine SOAP-Nachrichtenprotokollschicht hinzu, die Web-Apps, die zur Datierung dieses "Schweins" gezwungen wurden, einen Leistungseinbruch verleiht. Ich arbeite gerade an einem Projekt, in dem unsere neue MVC-4-App angewiesen wurde, eine solche DAL zu verwenden. Wir müssen sowohl die WebMethod-Signatur als auch die SP-Signatur ändern, wenn eine neue User Story erscheint, die solche Änderungen erforderlich macht. Was für uns jeder einzelne Sprint ist. In einem solchen Durchgangsansatz sind zwei eng gekoppelte Ebenen enthalten.

Sevasanakid
quelle
1
Die Web-API hat das Problem mit dem Aufblähen von WCF / SOAP behoben. Es ist jetzt wie eine leichte, fitte, bewegliche Katze; genau das, was es braucht, um RESTfully zu dienen.
Samis
Theoretisch ist es nicht falsch, gespeicherte Prozesse über Webdienste aufzurufen.
NoChance
2

1) Die Kopfschmerzen bei der Pflege der Datenbank werden von Entwicklern reduziert, sodass sie sich nur auf die Entwicklung konzentrieren können.

2) Der Webdienst unterstützt die Kommunikation verschiedener Plattformen (Betriebssysteme wie Windows, iOS, Android usw.) auf sehr einfache und effektive Weise. Stellen Sie sich zum Beispiel eine Situation vor, in der Android Application & iOS Application mit einer Java-basierten Website kommunizieren möchte. Für die Kommunikation aller drei Dinge ist der Webservice die beste Lösung, anstatt drei verschiedene Datenbanken zu verwalten.

Rohan
quelle
1

Allgemein

  1. Die Webdienststufe fördert die Wiederverwendung gemeinsamer Datenanforderungen für mehrere Anwendungen
  2. Der Webdienst kann mit der Versionsverwaltung eingerichtet werden, die viele Probleme bei der Entwicklung auf Anwendungsebene löst. Wenn ich beispielsweise neu in einem Projekt bin, dessen vorhandene Anwendung ich als gutes Modell für die Konfiguration meiner Anwendung für die Verwendung vorhandener Datenbankquellen verwende.
  3. Der Webdienst wurde weiterentwickelt, um flexible Optionen zum Senden von Anforderungen und zum Zurückerhalten von Antwortergebnissen in einem gemeinsamen Format wie JSON mithilfe eines einfachen URI zu ermöglichen. Dies bedeutet, dass Clientanwendungen unter Verwendung eines allgemeineren Standards entwickelt werden können, der zuverlässige einheitliche Schnittstellen fördert.

Ich werde gerade mit ASP.NET Web Api angestarrt und plane, zuerst Datendienste zu erstellen.

Ich habe mich kürzlich auf .NET MVC-Webanwendungen unter Verwendung des Entity-Frameworks konzentriert.

  1. Wenn Sie MVC bereits verwenden, verwendet die Web-API auch MVC mit dem Api-Controller, sodass die Lernkurve zum Erstellen der Dienste ziemlich einfach ist.

Ich befand mich kürzlich in einer frustrierenden Situation mit einer MVC-Web-App, die ich ursprünglich basierend auf gespeicherten Oracle-Prozeduren erstellt hatte. Die ursprüngliche Version als Oracle 9 oder noch früher, die ein weiteres Problem darstellte, als Visual Studio 2012 einen moderneren Ansatz für die Verbindungsfactory vorstellte, bei dem Assemblys mit Ladezeit anhand von Webkonfigurationsverbindungen und TNS-Namen die richtigen DLL-Dateien fanden.

Versuche, eine Verbindung zur Datenbank herzustellen, schlugen mit Fehlermeldungen fehl, die nicht mehr unterstützt wurden. Aus Neugier habe ich Oracle 12c heruntergeladen und einige Verbindungen auf Anwendungsebene hergestellt, die mit meinen TNS-Namen und der Load Assembly-DLL gut funktionierten, und ich konnte problemlos mit Oracle arbeiten.

Es wurden einige Webdienste erstellt, die mit Verbindungen zur älteren Oracle-Version arbeiteten. Sie wurden mit Methoden erstellt, die speziell zu meiner Enttäuschung ausgewählten Tabellen zugeordnet wurden. Ich müsste meine eigenen schreiben.

Mir wurde gesagt, dass die Gruppe, die für die Pflege der Oracle-Datenbanken verantwortlich war, neue gespeicherte Prozeduren schreiben würde, um die älteren zu ersetzen, die ich zum Abstrahieren der Clientschnittstellen- und Geschäftslogikschichten verwendete.

Meine ersten Gedanken waren also, dass alle gängigen Datenanforderungen wie das Ausfüllen von Dropdown-Listen oder die automatische Vervollständigung mit unternehmensweiten Daten über Datendienste erfolgen, die die gespeicherten Oracle-Prozeduren aufrufen. Warum sollte dieser Vorgang für jede Anwendung wiederholt werden und jeder Entwickler hat Probleme mit der Konfiguration und der Versions- / Lade-Assembly, TNS-Probleme?

so....

  1. Bei Problemen mit mehreren Datenbankservern, z. B. bei der Verwendung gespeicherter Oracle-Prozeduren in einer .NET MVC-Anwendung, bei der normalerweise EF für die SQL Server-Datennutzung verwendet wird, können Sie diese Probleme auf Web Api-Dienstmethoden übertragen, bei denen diese Konfigurationsprobleme isoliert werden können.
  2. Auch hier kann die Client-Schnittstelle mit JavaScript, JQuery und JSON ausgeführt werden, die Sie bereits verwenden, wenn Sie dies mit Web Api tun, um SQL Server-Datenanforderungen zu stellen.

Ich bin ein Anwendungsentwickler / -analyst und kein DBA. Meine Perspektive ist also eine aus Erfahrung mit der unendlichen Frustration, Anwendungen ständig ändern zu müssen, wenn sich Datenbank-Tools weiterentwickeln.

Brian Quinn
quelle