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 回答