微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GRPC 流正在不可靠地发送数据不正确、重复或丢失

如何解决GRPC 流正在不可靠地发送数据不正确、重复或丢失

我正在构建一个 Flutter 应用程序,其中包含与多个其他用户实时共享的项目列表。当一个用户选择一个项目时,所有其他用户都会通过产生一个或多个 SelectionContainer 对象的流收到该选择的通知

我遇到了一个问题,尽管服务器报告了准确的数据,但客户端从流中随机接收到不正确(有时甚至完全丢失)的数据。

这是我的订阅功能的 GRPC 代码

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;
}

这里是我的监听函数的客户端 Dart 代码

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 举报,一经查实,本站将立刻删除。