Vergleich von TCP / IP-Anwendungen mit HTTP-Anwendungen [geschlossen]

13

Ich interessiere mich für die Entwicklung einer großen Website für Benutzer, die in Java geschrieben ist.

Beim Design denke ich darüber nach, unabhängige, modulare Dienste zu entwickeln, die als Datenanbieter für meine Hauptwebanwendung fungieren können.

Beim Schreiben dieser modularen Dienste (Datenanbieter) kann ich ein vorhandenes Framework wie Spring nutzen und diese Dienste nach dem RESTful-Entwurfsmuster entwickeln und Ressourcen über HTTP mit einem Nachrichtenformat wie JSON verfügbar machen. Oder ich kann ein vorhandenes Netzwerk nutzen Framework wie Netty ( http://netty.io/ ) und Serialisierungsformat wie Protobufs ( https://developers.google.com/protocol-buffers/docs/overview ) und entwickeln Sie einen TCP-Server, der den serialisierten Protobuf hin und her sendet Nutzlast.

Wann solltest du eins vor dem anderen wählen? Wäre es von Vorteil, ein Serialisierungsformat wie Protobufs zu verwenden und Bytestrom über die Leitung zu senden? Wäre die Verwendung von JSON mit einem Mehraufwand verbunden? Wie viel Aufwand entsteht zwischen der Verwendung von TCP / IP und der Verwendung von HTTP? Wann sollten Sie Spring over Netty verwenden und umgekehrt, um einen solchen Service aufzubauen?

HiChews123
quelle
Es hört sich so an, als würden Sie mehr über den Technologie-Stack nachdenken als über die tatsächlichen Anforderungen. Wie könnte irgendjemand von uns diese Frage beantworten, ohne zu wissen, was Sie tun müssen ? Entwickeln Sie ein Multiplayer-Spiel, das eine Latenz von nahezu Null haben soll? Oder eine Social-Bookmarking-Anwendung, bei der der größte Teil des Zugriffs bereits über HTTP erfolgt und Sie möglicherweise stundenlang Daten zwischenspeichern und sich nicht einmal um die Aktualität oder gar die Latenz kümmern?
Aaronaught
3
Ich glaube nicht, dass OP uns bittet, eine Wahl für ihn zu treffen. Er stellt lediglich eine hochrangige Frage, wie solche Entscheidungen getroffen werden und welche Faktoren berücksichtigt werden. Denken Sie nicht, dass es etwas Falsches ist, eine hochrangige Antwort darauf zu geben ... und ich tat es.
DXM
Ich bin im Allgemeinen gegen die Verwendung von Binärformaten, es sei denn, Sie müssen wirklich. Keine binären Dateiformate, keine binären Serialisierungen usw. Beispielsweise verursachen binäre Serialisierungen in Java Inkompatibilitäten zwischen Java-Versionen und Versionen Ihrer eigenen Software, aber ich glaube, dass XML bei weitem nicht so häufig ist. Ich würde das folgende TCP / IP> HTTP> XML denken. Natürlich würde es davon abhängen, was Sie tun. Ich denke, dass JSON eine Alternative zu XML ist. Ich weiß nicht viel über Spring oder Netty, obwohl ich lese, dass die Leute Spring benutzen.
Kaydell
+1 DXM, ich stelle hochrangige Fragen als Denkanstoß, wenn ich über eine solche Entscheidung nachdenke.
HiChews123

Antworten:

21

Es gibt definitiv Vor- und Nachteile bei der Verwendung von JSON über REST im Vergleich zu TCP / IP mit Binärprotokoll, und ich glaube, Sie ahnen bereits, dass das Binärprotokoll schneller sein wird. Ich kann Ihnen nicht genau sagen, wie viel schneller (und dies würde von vielen Faktoren abhängen), aber ich würde vielleicht 1-2 Größenordnungen Unterschied schätzen.

Wenn etwas auf den ersten Blick 10-100 Mal langsamer ist als etwas anderes, kann es sein, dass Sie mit einem Ruck reagieren und sich für "schnelles Ding" entscheiden. Dieser Geschwindigkeitsunterschied liegt jedoch nur im Protokoll selbst. Wenn auf der Serverseite Datenbank- / Dateizugriff besteht, wird dies durch die Auswahl der Übertragungsebene nicht beeinträchtigt. In einigen Fällen kann dadurch die Geschwindigkeit Ihrer Übertragungsschicht erheblich verringert werden.

HTTP REST und JSON sind aus mehreren Gründen gut:

  • Sie können von nahezu jedem konsumiert werden. Sie können Ihre Web-App schreiben, sich dann umdrehen und Ihre API für den Rest der Welt veröffentlichen. Jetzt kann jeder die gleichen Endpunkte erreichen und zu Ihren Diensten gelangen
  • Sie sind leicht zu debuggen, Sie können einen Paket-Sniffer öffnen oder einfach eingehende Anfragen in Textdateien ablegen und sehen, was los ist. Mit binären Protokollen geht das nicht
  • Sie sind leicht erweiterbar. Sie können zu einem späteren Zeitpunkt weitere Attribute und Daten hinzufügen, ohne die Kompatibilität mit alten Clients zu beeinträchtigen.
  • Verbrauchbar für Javascript-Clients (nicht sicher, ob sie einen Protobuf-JS-Parser haben, glaube nicht, dass es einen gibt)

Protobufs über TCP / IP:

  • Sie sind schneller

Wenn es meine Wahl wäre, würde ich zweifellos mit HTTP REST und JSON gehen. Es gibt einen Grund, warum so viele andere Unternehmen und Websites diesen Weg eingeschlagen haben. Denken Sie auch daran, dass Sie in Zukunft immer 2 Endpunkte unterstützen könnten. Wenn Ihr Entwurf korrekt ist, sollte Ihre Endpunktauswahl vollständig von Ihrer serverseitigen Geschäftslogik oder der Datenbank entkoppelt sein. Wenn Sie später feststellen, dass Sie mehr Geschwindigkeit für alle / einige Anfragen benötigen, sollten Sie in der Lage sein, Protobufs mit minimalem Aufwand hinzuzufügen. REST / JSON bringt Sie jedoch auf Anhieb schneller auf den Boden und bringt Sie weiter.

So weit wie Netty vs Spring geht. Ich habe Netty nicht direkt verwendet, aber ich glaube, es ist nur ein leichter Webserver, bei dem Spring ein Framework ist, das Ihnen viel mehr als nur das bietet. Es verfügt über Datenzugriffsebenen, Hintergrundjobplanung und (glaube ich) ein MVC-Modell, ist also viel schwerer. Welches soll ich wählen? Wenn Sie sich für HTTP entschieden haben, ist die nächste Frage wahrscheinlich, wie standardisiert Ihre App ist. Wenn Sie im Begriff sind, eine verrückte benutzerdefinierte Logik zu schreiben, die nicht in die Standardform passt, und Sie lediglich eine HTTP-Serverebene benötigen, entscheiden Sie sich für Netty.

Ich vermute jedoch, dass Ihre App nicht so besonders ist und wahrscheinlich von vielen Dingen profitieren könnte, die Spring zu bieten hat. Das bedeutet jedoch, dass Sie Ihre App nach dem Framework von Spring strukturieren und die Dinge so tun sollten, wie sie von Ihnen erwartet werden. Dies würde bedeuten, dass Sie mehr über Spring erfahren, bevor Sie sich mit Ihrem Produkt befassen. Frameworks sind im Allgemeinen großartig, weil sie Sie wieder schneller auf den Weg bringen, aber der Nachteil ist, dass Sie in ihre Form passen müssen, anstatt Ihr eigenes Design zu erstellen, und dann erwarten, dass das Framework nur funktioniert.

(*) - In der Vergangenheit wurde darauf hingewiesen, dass meine Posts nicht die Meinungen der ganzen Welt widerspiegeln. Ich gehe auf die Aufzeichnung und füge nur hinzu, dass ich nur begrenzte Erfahrung mit Netty habe (ich habe zuvor das Play-Framework verwendet) das basiert auf Netty) oder Spring (ich habe nur darüber gelesen). Also nimm was ich sage mit einem Körnchen Salz.

DXM
quelle
1
+1, insbesondere für "Dieser Geschwindigkeitsunterschied liegt nur im Protokoll selbst. Wenn auf der Serverseite Datenbank- / Dateizugriff besteht, wird dies durch die Auswahl der Übertragungsschicht nicht beeinträchtigt." 99% genau so wird es sein, und eine vorzeitige Optimierung (am falschen Ort) hilft dabei überhaupt nicht.
Shivan Dragon
Vielen Dank für Ihre langwierige Antwort und eingehende Analyse zum Vergleich der beiden. Ich verstehe die Vorteile einer RESTful-Anwendung, da sie von öffentlichen Kunden problemlos verwendet werden kann. In dem Fall jedoch, dass ich alles im Haus behalten und den Dienst nicht verfügbar machen möchte (ich kümmere mich um Serialisierung / Deserialisierung), kann ich nicht erkennen, warum die Verwendung eines benutzerdefinierten Binärprotokolls nicht die erste Wahl wäre. Ja, Sie können mit vorhandenen Frameworks schneller loslegen, jedoch auf Kosten der APIs und einer weniger präzisen Steuerung.
HiChews123
REST ist für ALLE Kunden leicht zu konsumieren, nicht nur für öffentliche, sondern sie sind sicherlich auch enthalten. Meine Firma hat ein Produkt, das wir seit ungefähr einem Jahr bauen. Wir hatten ein "proprietäres" Protokoll, das zufällig zur Ruhe kam. Wir haben es nur für andere geöffnet. Eine Sache, die sie Ihnen in der Business School beibringen, ist das "Options Thinking". Treffen Sie Entscheidungen, um Ihnen so viele Optionen wie möglich zu lassen, damit Sie zu einem späteren Zeitpunkt Entscheidungen treffen können. Wenn alle Werte gleich sind, würde ich REST wählen, nicht weil ich heute über JS-Clients oder API-Zugriff verfüge, sondern weil ich die Option habe, es in Zukunft zu haben, wenn ich es brauche.
Andererseits
... du bist auf binäres Protokoll eingestellt, mach es. 96-prozentige Wahrscheinlichkeit, dass Ihre Wahl des Protokolls keinen Einfluss auf Ihre endgültige Bewerbung hat, also würde ich diese Entscheidung nicht zu sehr schwitzen. Und wie ich in der Antwort sagte, sollten Sie mit anständigem Design in der Lage sein, Protokolle zu einem späteren Zeitpunkt zu tauschen. Eine andere Sache, die ich gerne mache, ist, beide Fälle zu versuchen. Wenn ich bei einer Entscheidung auf dem Zaun stehe, wirf ich eine Münze und wähle Option A aus. Wenn ich das nächste Mal ein ähnliches Projekt mache, wähle ich Option B aus, damit ich dann zurückgehen kann und vergleiche / kontrastiere meine Erfahrungen. Manchmal, das ist der einzige Weg , Sie für sich selbst entscheiden , was besser ist
DXM
@ DXM, tolle Antworten, Bravo!
HiChews123
0

Dies ist eigentlich keine Frage. Gemäß der Internet Protocol Suite ist tcp ein Protokoll in der Transportschicht und http ist ein Protokoll in der Anwendungsschicht. Sie vergleichen völlig verschiedene Dinge miteinander. (Weitere Informationen finden Sie hier: http://en.wikipedia.org/wiki/Internet_protocol_suite )

Tatsächlich ist das meiste http über TCP / IP. Um Ihre Frage zu beantworten, sollten Sie tcp / ip verwenden. Dann möchten Sie ein Anwendungsschichtprotokoll darüber (wie http) und dann ein Datenformat (wie json, xml, html) hinzufügen. Netty lässt Sie http verwenden und protobuff ist gleich json, xml, html.

Alles hängt davon ab, welche Anforderungen Sie haben und welche Art von Daten Sie transportieren müssen. Benötigen Sie Sitzungen in Ihrem Protokoll, kann ein Handshake Ihre Protokollkonfiguration verbessern, wie viele Daten werden Sie auf einmal senden, benötigen Sie Verschlüsselung? Diese Fragen müssen bei der Auswahl eines Anwendungsprotokolls beantwortet werden.

Für die Auswahl eines Datendarstellungsformats (json, xml, html, protobuff usw.) hängt es von Ihrer Bandbreite, Lesbarkeit, Sprache / Tool-Unterstützung usw. ab.

Sie können http nicht mit tcp vergleichen.

Denken Sie daran, dass Geschwindigkeit nicht alles ist. Geschwindigkeit nützt nichts, wenn Sie sich nicht vernünftig ausdrücken können.

iveqy
quelle
5
In seiner Frage gibt es nichts, was darauf hindeutet, dass er den Unterschied zwischen den Schichten des Netzwerkstapels nicht kennt. Er fragte, ob er HTTP verwenden soll (die Tatsache, dass HTTP eine Schicht über TCP / IP ist, wird vorausgesetzt) ​​oder TCP / IP mit seinem eigenen benutzerdefinierten Protokoll verwenden soll. An seiner Frage ist nichts auszusetzen.
Michael
Ich stimme natürlich nicht zu. So habe ich ihn nicht verstanden
am
1
Ja, ich verstehe, dass HTTP auf einer Ebene über TCP / IP liegt. Bei meiner Frage geht es in der Tat darum, eine Entscheidung in Bezug auf Kompromisse zu treffen - Latenz, Entwicklungsgeschwindigkeit usw. Vielen Dank, dass ich Fragen gestellt habe, über die ich nachdenken sollte!
HiChews123
2
@ acspd7 Ich würde es vermeiden, ein eigenes Protokoll zu erstellen. Es gibt viele bereits erprobte Protokolle. Wenn Ihr Protokoll Ihnen keinen Vorteil gegenüber Ihren Mitbewerbern verschafft, sind Sie mit einem Standardprotokoll wahrscheinlich besser dran. Ich habe ein benutzerdefiniertes Protokoll implementiert, es hat viel Spaß gemacht! Verschlüsselung, Lochen, Keep Alives, Handshaking (verschiedene Netzwerke erfordern unterschiedliche Framlengths) usw. sind jedoch eine Menge Arbeit, um die Dinge gut zu machen. Ganz zu schweigen von der Dokumentation, die Sie benötigen. Überlegen Sie sich, was Sie wirklich an Funktionen benötigen, bevor Sie eine benutzerdefinierte Funktion ausführen.
Iveqy
1
GPBs sind gut dokumentiert und werden von vielen anderen verwendet, so dass ich keine wirklichen Probleme bei der Verwendung sehe. Knapper zu sein als XML und JSON sollte großartig sein! (Möglicherweise mangelt es Ihnen an Lesbarkeit, aber wenn dies nicht erforderlich ist ...). Vermissen Sie jedoch keine Ebene? Normalerweise hast du eine Ebene zwischen tcp und xml, json, protobuff. So etwas wie http, ssh, etc.
Iveqy