【发布时间】:2022-03-26 05:04:46
【问题描述】:
我如何知道我通过 gRPC 流发送的消息已在另一端收到?
在 gRPC 双向流式传输中是否有内置方法可以做到这一点,还是我只需要使用流式传输然后发回响应?
原型文件:
service SimpleService {
rpc SimpleRPC (stream SimpleData) returns (stream SimpleData) {}
}
message SimpleData {
string msg = 1;
}
转码:
client := pb.NewSimpleServiceClient(conn)
stream, err := client.SimpleRPC(context.Background())
waitc := make(chan struct{})
msg := &pb.SimpleData{"sup"}
go func() {
for {
stream.Send(msg)
}
}()
<-waitc
stream.CloseSend()
【问题讨论】:
-
它基于 tcp,发送成功的消息就足够了。但否则为每条发送的消息添加一个 tx id。将其传递回响应中,以便发件人可以匹配查询以获得响应。
-
所以发回带有消息ID或其他内容的异步响应,如果没有响应则重新发送?
-
可能是异步的,也可能不是。这取决于协议。但是,同样,这是基于 tcp 的流,所以发送/接收是可靠的。
-
不需要,TCP 连接会自动进行数据包级别的确认,为此添加另一层只是矫枉过正。正如@mh-cbon 之前所说,它是可靠的。
-
但是如果我在服务器离线的那一刻发送消息 if stream.Send(msg) gRCP 会告诉我有错误吗?
标签: go streaming grpc bidirectional