TCP / IPアプリケーションとHTTPアプリケーションの比較[終了]


13

Javaで書かれた大規模なユーザー向けWebサイトの開発に興味があります。

設計に関しては、メインのWebアプリケーションに対するデータプロバイダーとして機能できる、独立したモジュラーサービスの開発を考えています。

これらのモジュラーサービス(データプロバイダー)の作成については、Springなどの既存のフレームワークを活用し、RESTfulデザインパターンに従ってこれらのサービスを開発し、JSONなどのメッセージ形式でHTTPを介してリソースを公開するか、既存のネットワークを活用できますNetty(http://netty.io/)のようなフレームワークとProtobufs(https://developers.google.com/protocol-buffers/docs/overview)のようなシリアル化形式、およびシリアル化されたprotobuf を送受信するTCPサーバーを開発するペイロード。

どちらを選択するかはいつですか?Protobufsのようなシリアル化形式を使用して、ワイヤを介してバイトストリームを送信する利点はありますか?JSONを使用するだけでオーバーヘッドが発生しますか?TCP / IPを使用してからHTTPを使用するまでのオーバーヘッドはどれくらいですか?そのようなサービスを構築するためにSpring over Nettyをいつ使用する必要がありますか?


実際の要件よりもテクノロジースタックについて考えているようです。どのように私たちのいずれかが、おそらくそれはあなたがする必要があることは何か知らずにこの質問に答えることができませんか?レイテンシーがほぼゼロのマルチプレイヤーゲームを作成していますか?または、ほとんどのアクセスが既にHTTP経由であり、一度に何時間もデータをキャッシュしていて、新鮮さを気にせず、レイテンシーも気にしないソーシャルブックマークアプリケーションですか?
アーロンノート

3
OPが彼に選択を求めているとは思わない。彼は単に、そのような選択がどのように行われ、どの要因が考慮されるかについて、高レベルの質問をしているだけです。それに対する高レベルの答えを提供することは間違っているとは思わないでください。
DXM

本当に必要な場合を除き、バイナリ形式を使用することは一般的に反対です。バイナリファイル形式、バイナリシリアル化などはありません。たとえば、Javaでは、バイナリシリアル化によってJavaバージョンとご使用のソフトウェアのバージョンとの間に互換性がなくなりますが、XMLはほとんど同じではないと思います。次のTCP / IP> HTTP> XMLを考えると、もちろん、それはあなたが何をしているかに依存するでしょう。JSONはXMLに代わるものだと思います。SpringやNettyについてはあまり知りませんが、人々がSpringを使用していることは読んでいます。
カイデル

+1 DXM、私はそのような決定をすることを考えるとき、思考の糧として高レベルの質問をしている。
HiChews123

回答:


21

JSONをREST経由で使用することと、バイナリプロトコルを使用するTCP / IPを直接使用することの長所と短所は間違いなくあります。どのくらい高速であるかを正確に伝えることはできません(これは多くの要因に依存します)が、1〜2桁の違いがあると思います。

一見、何かが他の何かよりも10〜100倍遅い場合、あなたはひざまずき反応をして、「速いこと」に進むかもしれません。ただし、この速度の違いはプロトコル自体のみです。サーバー側にデータベース/ファイルアクセスがある場合、転送レイヤーの選択によって影響を受けることはありません。場合によっては、転送レイヤーの速度が大幅に低下する可能性があります。

HTTP RESTとJSONは、いくつかの理由で優れています。

  • 誰でも簡単に消費できます。Webアプリを作成してから、APIを有効にして公開し、世界中で使用できるようにします。誰でも同じエンドポイントにアクセスして、サービスにアクセスできるようになりました
  • それらは簡単にデバッグできます。パケットスニファーを開くか、単に着信リクエストをテキストファイルにダンプして、何が起こっているかを確認できます。バイナリプロトコルではできません
  • 簡単に拡張できます。後で属性とデータを追加して、古いクライアントとの互換性を損なうことはありません。
  • javascriptクライアントが消費可能(protobuf JSパーサーがまだあるかどうかはわかりませんが、1つあるとは思わないでください)

TCP / IP上のProtobufs:

  • 彼らは速いです

私の選択であれば、HTTP RESTとJSONを使います。他の多くの企業やウェブサイトがその道を進んだ理由があります。また、将来的には常に2つのエンドポイントをサポートできることに留意してください。設計が正しい場合、エンドポイントの選択は、サーバー側のビジネスロジックまたはデータベースから完全に切り離す必要があります。したがって、すべて/一部の要求に対してより高速が必要であることに気付いた場合、最小限の手間でprotobufsを追加できるはずです。ただし、REST / JSONを使用すると、すぐに地面から離れて、さらに先に進むことができます。

Netty対Springに関しては。私はNettyを直接使用したことはありませんが、Springはそれだけでなく多くの機能を提供するフレームワークであるため、単なる軽量のWebサーバーであると考えています。データアクセスレイヤー、バックグラウンドジョブスケジューリング、MVCモデル(と思う)があるため、はるかに重量があります。どちらを選ぶべきですか?HTTPを使用することにした場合、次の質問はおそらくアプリの標準です。標準的な型に合わないクレイジーなカスタムロジックを作成しようとしており、必要なものがHTTPサーバーレイヤーだけである場合は、Nettyを使用します。

ただし、アプリはそれほど特別なものではなく、Springが提供する多くの機能の恩恵を受ける可能性があります。ただし、これは、Springのフレームワークを中心にアプリを構築し、期待どおりに物事を行う必要があることを意味します。つまり、製品に飛び込む前に、Springについてさらに学ぶ必要があります。フレームワークは一般に素晴らしかったです。これもまた、より早く軌道に乗ることができますが、欠点は、独自の設計を行うのではなく、型に適合し、フレームワークが正常に機能することを期待することです。

(*)-過去に、私の投稿は全世界の意見を反映していないことが指摘されていたため、記録に進み、Nettyの経験が限られていることを追加します(以前にPlayフレームワークを使用したことがあります) Nettyに基づいています)またはSpring(私はそれについて読んだだけです)。だから私が言ったことを一粒の塩で取ってください。


1
+1、特に「この速度の違いはプロトコル自体にのみあります。サーバー側にデータベース/ファイルアクセスがある場合、転送レイヤーの選択によって影響を受けることはありません」。99%はまさにそれであり、時期尚早な最適化(間違った場所で)はまったくそれを助けません。
シヴァンドラゴン

長いご回答と、2つの比較に関する詳細な分析をありがとうございます。RESTfulアプリケーションを作成する利点は、公開クライアントが簡単に使用できるため理解しています。ただし、すべてを社内に保持し、サービスを公開したくない場合(シリアル化/逆シリアル化を処理します)、カスタムバイナリプロトコルを使用しないことが最初の選択ではない理由がわかりません。はい、既存のフレームワークを使用してより早く軌道に乗ることができますが、APIにロックされ、きめの細かい制御が犠牲になります。
HiChews123

RESTは、パブリッククライアントだけでなく、すべてのクライアントが簡単に使用できますが、それらは確かに含まれています。私の会社には、私たちが今から約1年間構築している製品があります。私たちには、たまたま休んでいた「独自の」プロトコルがありました。他の人に公開しました。彼らがビジネススクールであなたに教える一つのことは、「オプション思考」であり、あなたが後日決定を下せるように、できるだけ多くのオプションを残す決定をします。すべてのセットが等しいとすると、RESTを選択するのは、今日JSクライアントまたはAPIアクセスを持っているからではなく、必要に応じて将来的にそれを使用するオプションがあるからです。その後、再び
...-DXM

...バイナリプロトコルを使用するよう設定されています。96%の確率で、選択したプロトコルが最終的なアプリケーションに影響を与えないので、その決定をあまり気にしません。そして、答えで言ったように、まともなデザインで、とにかく後日プロトコルを交換できるはずです。私がやりたいもう一つのことは、両方のケースを試してみて、決定をする際にフェンスにいる場合は、コインを投げてオプションAを選択します。そして私の経験を比較/対比します。時には、それが優れている、あなたが自分で決める唯一の方法だ
DXM

@DXM、素晴らしい反応、素晴らしい!
HiChews123

0

これは実際には非質問です。インターネットプロトコルスイートによると、tcpはトランスポート層のプロトコルであり、httpはアプリケーション層のプロトコルです。まったく異なるものを互いに比較しています。(詳細はこちらをご覧ください:http : //en.wikipedia.org/wiki/Internet_protocol_suite

実際、ほとんどのhttpはtcp / ip上にあります。質問に答えるには、tcp / ipを使用する必要があります。次に、その上にアプリケーション層プロトコル(httpなど)を追加し、次にデータ形式(json、xml、htmlなど)を追加します。Nettyではhttpを使用でき、protobuffはjson、xml、htmlと同じです。

それはすべて、要件が何であり、どのタイプのデータを転送する必要があるかによって異なります。プロトコルでセッションが必要ですか、ハンドシェイクでプロトコル構成を改善できますか、一度に送信するデータの量は、暗号化が必要ですか?これらは、アプリケーションプロトコルを選択するときに答える必要がある質問です。

データ表現形式(json、xml、html、protobuffなど)を選択する場合、帯域幅、読みやすさ、言語/ツールのサポートなどに依存します。

httpとtcpを比較することはできません。

速度がすべてではないことを忘れないでください。賢明な方法で自分を表現できない場合、速度は役に立ちません。


5
彼の質問には、ネットワークスタックのレイヤー間の違いがわからないことを示唆するものは何もありません。彼は、HTTP(HTTPはTCP / IPの上の層であるという事実が想定されている)を使用するか、独自のカスタムプロトコルでTCP / IPを使用するかを尋ねました。彼の質問には何の問題もありません。
マイケル

もちろんそうは思いません。それは私が彼を理解した方法ではない
-iveqy

1
はい、HTTPはTCP / IPの上の層にあることを理解しています。私の質問は、トレードオフの観点から決定を下すことについて考えることです-遅延、開発の速度など。
HiChews123

2
@ acspd7独自のプロトコルの作成は避けたいと思います。すでに実証済みのプロトコルがたくさんあります。あなたのプロトコルが競合他社よりも有利なものでない限り、おそらく標準のプロトコルをお勧めします。私はカスタムプロトコルを実装しましたが、とても楽しかったです!ただし、暗号化、ホールパンチ、キープアライブ、ハンドシェイク(異なるネットワークでは異なるフレーム長が必要)など。必要なすべてのドキュメントは言うまでもありません。カスタムを実行する前に、機能で本当に必要なものを考えてください。
iveqy 2013年

1
GPBは十分に文書化されており、他の多くの人が使用しているため、GPBの使用に問題はありません。XMLやJSONよりも簡潔であることは素晴らしいことです!(人間の可読性に欠ける可能性がありますが、それが要件でない場合は...)。しかし、レイヤーを見逃していませんか?通常、tcpとxml、json、protobuffの間にレイヤーがあります。http、sshなどのようなもの
iveqy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.