从客户端向服务器发送大量数据

时间:2017-12-06 05:34:25

标签: go grpc

我正在使用GrpcXML。我有一个XML文件要从客户端发送到服务器。当服务器在客户端上调用方法时,客户端会使用kB文档进行回复,该文档的范围可以从少量MB到100秒string,也可能更多。请帮我怎么做?我应该

  1. 将值分配给rpc GetCMData (CmRequest) returns (CmReply) {}变量并正常发送 - > string
  2. 将值分配给stream变量并发送为rpc GetCMData (CmRequest) returns (stream CmReply) {} - > CmReply
  3. 还有其他更好的方法吗?
  4. 这就是message CmReply { string name = 1; } 的样子:

    {{1}}

2 个答案:

答案 0 :(得分:2)

第二个更像你想要的方式。但另一点:你确定要在RAM中拥有这些数百兆字节吗?我不是Go-Geek,但我通常更愿意使用文件流。并且可能实施类似背压系统的东西。

如果你使用流:我也会实现一些东西,以确保你可以处理流的中断。让我们假设你有一半的流和流中断了。您不想再次启动并获取您在客户端已有的所有先前的流元素。您再次面临流中的连接中断风险。也许在同一点上。所以,像分页一样。让我们说

message CMRequest{
  int startAt = 0;
}

message CmReply {
  string id = 0;
  string name = 1;
}

如果流中断,则发送一个新请求,其中startAt = LastCmReply.id + 1

以下是grpc中一些良好做法的视频:https://www.youtube.com/watch?v=Z_yD7YPL2oE&index=17&list=WL

答案 1 :(得分:1)

您有两种选择:

  1. 以您上面描述的方式实现客户端流式传输协议(将文件拆分为块并将它们逐个发送到服务器): https://github.com/grpc/grpc-go/issues/414#issuecomment-284515856
  2. 扩展4 MB客户端和服务器的邮件大小的默认GRPC限制(然后您就可以在不流式传输的情况下发送和接收大邮件): https://godoc.org/google.golang.org/grpc#MaxMsgSize https://godoc.org/google.golang.org/grpc#WithMaxMsgSize