2

私は分散システム (Java/EE、netty、protobuf) を使用しています。ドキュメントをクライアントからサーバーに送信し、サーバー データベースに保存する方法を考えています。

文字列を送信するのは簡単そうに見えますが、大きなファイルを送信するにはどうすればよいですか。小さなメッセージにチャンクして送信する必要がありますか?

ドキュメントの操作方法に関する優れたチュートリアル。

4

1 に答える 1

1

netty のボイラープレート コード部分を使用し、プロトコル バッファー インターセプターが設定された実行中のサーバーがあり、プロトコル バッファー関連のクラスを生成したと仮定します。これらの手順についてサポートが必要な場合は、そう言ってください。編集して追加します。

まず最初に、データの大きなチャンク (ヒープで調整できるもの) をシリアライズすることは、protobuf ではうまくいきません。やるべきことは簡単です。

1- コンテンツの (バッファリングされた) バイト ストリームを取得します 2- protobuf メッセージ (例: ContentChunk) を作成し、チャンクの順序とチャンク部分を表す最小 2 つのフィールドを追加します (同時トラフィックによっては、チャンク部分がヒープをクラックしないようにする必要がありますサイズを賢く最適化してください)自体。チャンクの順序は、サーバー側が正しい順序でチャンクを再構築するのに役立ちます。3- チャンクの内部フレーミング用にフィールドを追加するか、最初のメッセージで全長を渡すことができます。4- 最後に、メイン プロトコル メッセージの外側のフレーミングを実装します。チャンクを取得し、最終的なコンテンツを形成して永続化します。

4 番目の項目については、Netty の現在のフレーミング サポートを確認してください。

ProtobufVarint32FrameDecoder ProtobufVarint32LengthFieldPrepender

パイプラインは次のようになります。

        bootstrap.setPipelineFactory (new ChannelPipelineFactory () {
        @Override
        public ChannelPipeline getPipeline () throws Exception {
            ChannelPipeline pipeline = Channels.pipeline ();
            pipeline.addLast ("frameDecoder", new ProtobufVarint32FrameDecoder ());
            pipeline.addLast ("protobufDecoder", new ProtobufDecoder (YOURPROTOCOL.ProtocolMessage.getDefaultInstance ()));

            pipeline.addLast ("frameEncoder", new ProtobufVarint32LengthFieldPrepender ());
            pipeline.addLast ("protobufEncoder", new ProtobufEncoder ());

            pipeline.addLast ("handler", new ClientEventHandler ());
            return pipeline;
        }
    });
于 2013-10-07T13:12:10.670 に答える