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

Send huge data from client to server

我正在与 GoGrpc 合作。我有一个 XML 文件要从客户端发送到服务器。当服务器调用客户端上的方法时,客户端会返回一个 XML 文档,该文档的范围可以从几 kB 到 100 秒 MB 或更多。请帮我看看我该怎么做?我应该

  1. 将值赋给一个string变量并正常发送 -> rpc GetCMData (CmRequest) returns (CmReply) {}
  2. 将值分配给 string 变量并作为 stream -> rpc GetCMData (CmRequest) returns (stream CmReply) {}
  3. 发送
  4. 还有其他更好的方法吗?

这是 CmReply 的样子:

message CmReply {
  string name = 1;
}

第二个更像你想走的路。但还有一点:您确定要在 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. 按照您上面描述的方式实施客户端流协议(将您的文件分成块并将它们一个接一个地发送到服务器): https://github.com/grpc/grpc-go/issues/414#issuecomment-284515856
  2. 为您的 GRPC 客户端和服务器扩展消息大小的默认 4 MB 限制(这样您就可以在不流式传输的情况下发送和接收大消息): https://godoc.org/google.golang.org/grpc#MaxMsgSize https://godoc.org/google.golang.org/grpc#WithMaxMsgSize