如何解决GRPC 流正在不可靠地发送数据不正确、重复或丢失
我正在构建一个 Flutter 应用程序,其中包含与多个其他用户实时共享的项目列表。当一个用户选择一个项目时,所有其他用户都会通过产生一个或多个 SelectionContainer
对象的流收到该选择的通知。
我遇到了一个问题,尽管服务器报告了准确的数据,但客户端从流中随机接收到不正确(有时甚至完全丢失)的数据。
func (s *Server) SelectionSubscribe(in *SelectionCurrentUsersRequest,stream cpuser_SelectionSubscribeServer) error {
log.Print("Trying to subscribe")
for _,c := range s.selects {
if c.tokenCode == in.TokenCode {
for {
cont := <-c.tokenSelects
log.Printf("Data from channel: %v",cont)
if err := stream.Send(&cont); err != nil {
c.tokenSelects <- cont
log.Printf("Stream connection Failed: %v",err)
return nil
}
}
}
}
return nil;
}
Stream<SelectionContainer> listenForOrderUpdates() async* {
var authReq = AuthTokenRequest(token: global.authToken);
var request = SelectionCurrentUsersRequest(authRequest: authReq);
var stream = client.selectionSubscribe(request);
await for (SelectionContainer response in stream) {
print("RESPONSE: $response");
yield response;
}
stream.cancel();
}
对于额外的上下文,当我在第一台设备上快速选择三个项目(ID:1、2、3)时,服务器总是打印出 ID 1、2 和 3 已被选中,这是完全准确的。但是,有时第二个设备可能会报告已选择 ID 1、2 和 2,而第三个设备可能会报告已选择 ID 1、1 和 3。有时,客户端甚至可能不会报告三个 ID。客户端接收的值似乎是随机的。
有人知道这是为什么吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。