Javaで書かれた大規模なユーザー向けWebサイトの開発に興味があります。
デザインに関しては、メインのWebアプリケーションのデータプロバイダーとして機能できる独立したモジュール式サービスの開発を考えています。
これらのモジュラーサービス(データプロバイダー)の記述に関しては、Springのような既存のフレームワークを活用し、RESTful設計パターンに従ってこれらのサービスを開発し、JSONのようなメッセージ形式でHTTP経由でリソースを公開できます...または既存のネットワークを活用できますNetty( http://netty.io/ )のようなフレームワークとProtobufs( https://developers.google.com/protocol-buffers/docs/overview のようなシリアル化フォーマット)およびTCPサーバーを開発して、シリアル化されたprotobufペイロードを送受信します。
いつどちらを選ぶべきですか? Protobufsのようなシリアル化フォーマットを使用し、バイトのストリームをネットワーク経由で送信することの利点はありますか? JSONを使用するだけでオーバーヘッドはありますか? TCP/IPの使用とHTTPの使用の間にはどのくらいのオーバーヘッドがありますか?そのようなサービスを構築するために、Spring over Netty、またはその逆をいつ使用する必要がありますか?
RESTと比較して、JSONをバイナリプロトコルで直接TCP/IPで使用する場合と比べて、間違いなく長所と短所があり、バイナリプロトコルの方が高速であるとすでに疑っています。私にはわかりません。正確にはどれだけ速いか(そして、これは多くの要因に依存します)ですが、おそらく1〜2桁の差があると思います。
一見、何かが他のものより10〜100倍遅い場合、ひどく反応し、「速い」ことになるかもしれません。ただし、この速度の違いはプロトコル自体にのみあります。サーバー側にデータベース/ファイルアクセスがある場合、転送レイヤーの選択による影響は受けません。場合によっては、転送層の速度が大幅に低下することがあります。
HTTP RESTおよびJSONは、さまざまな理由で優れています。
TCP/IPを介したプロトコル:
それが私の選択であった場合、私はHTTP RESTとJSONを使用します。他の多くの企業やウェブサイトがそのルートをたどったのには理由があります。また、将来的には常に2つのエンドポイントをサポートします。設計が正しい場合は、エンドポイントの選択をサーバー側のビジネスロジックまたはデータベースから完全に切り離す必要があります。そのため、後ですべてまたは一部の要求に対してより高速が必要であることがわかった場合、最小限の手間でprotobufを追加できるはずですが、すぐに使用できますが、REST/JSONを使用すると、より早く地面から離れ、さらに遠くまで行けるようになります。
Netty vs Springに関する限り。私はNettyを直接使用していませんが、それは軽量のWebサーバーであり、Springはそれだけではない多くの機能を提供するフレームワークであると考えています。データアクセスレイヤー、バックグラウンドジョブスケジューリング、および(おそらく)MVCモデルがあるため、はるかに重いです。どれを選ぶ? HTTPを使用することにした場合、次の質問はおそらくあなたのアプリがどの程度標準的であるかです。標準の型に合わないクレイジーなカスタムロジックを記述しようとしていて、必要なのはHTTPサーバーレイヤーだけの場合は、Nettyを使用してください。
しかし、あなたのアプリはそれほど特別ではなく、Springが提供する多くのことから利益を得る可能性があると思います。ただし、これは、Springのフレームワークを中心にアプリを構造化し、期待どおりの方法で行う必要があることを意味します。つまり、製品に飛び込む前に、Springについてさらに学ぶ必要があります。フレームワークは一般的に優れています。これもまた、より早く地面から離れられるためですが、欠点は、独自の設計を行うのではなく、型に合わせてフレームワークが機能することを期待する必要があることです。
(*)-以前は私の投稿が全世界の意見を反映していないことが指摘されていたので、記録に移り、どちらかのNettyでの経験が限られていることを追加します(以前にPlayフレームワークを使用したことがあります)これはNettyに基づいています)またはSpring(私はそれについてしか読んでいません)。だから私が塩の粒で言うことを取りなさい。
これは実際には問題ではありません。インターネットプロトコルスイートによれば、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を比較することはできません。
スピードがすべてではないことを忘れないでください。賢明な方法で自分を表現できない場合、速度は役に立ちません。