I'm building a Flutter app that contains a list of items that are shared live with multiple other users. When one user selects an item, all other users are notified of the selection via a stream that yields one or more SelectionContainer
objects.
I'm having an issue where clients are randomly receiving incorrect (or sometimes flat-out missing) data from the stream, despite the server reporting accurate data.
Here is the GRPC code for my subscription function:
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;
}
And here is the client-side Dart code for my listening function:
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();
}
For extra context, when I quickly select three items (IDs: 1, 2, 3) on the first device, the server always prints that IDs 1, 2, and 3 have been selected, which is completely accurate. Sometimes, however, a second device might report that IDs 1, 2, and 2 have been selected, while a third device might report that IDs 1, 1, and 3 have been selected. Occasionally, a client might not even report three IDs. It appears to be random which values the clients receive.
Does anyone know why this is?
question from:
https://stackoverflow.com/questions/65856394/grpc-stream-is-sending-data-unreliably-either-incorrect-duplicate-or-missing 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…