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?
Antworten:
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:
Protobufs über TCP / IP:
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.
quelle
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.
quelle