Hi,
We are using protobuffers and Go version of gRPC to implement communication
layer in the library we are building. Communication-wise the situation in
our case is that we have multiple (possibly concurrent) clients and a
server. We are using bidirectional streams between clients and the server,
as we want a "ping-pong like" behavior where a series of requests and
responses has to flow between a specific client and a server for the RPC
service to successfully complete - we can think of it as a sort of a
session or a transaction.
The RPC service is defined as follows:
service MyProtocol {
rpc ExecuteProtocol (stream Message) returns (stream Message) {}
}
For the above service, a series of 6 messages of type Message are
transferred, something like this: client_request_1, server_response_1,
client_request_2, server_response_2, client_request_3, server_response_3.
We fire up a gRPC server like this:
grpcServer := grpc.NewServer(grpc.MaxConcurrentStreams(math.MaxUint32))
pb.RegisterProtocolServer(grpcServer, NewMyProtocolServer())
grpcServer.Serve(listener)
And then we want to test with several concurrent clients with the help of
goroutines, like this:
var wg sync.WaitGroup
wg.Add(n)
for i := 0; i < n; i++ {
defer wg.Done()
go runMyProtocolClient()
}
wg.Wait()
When we run only one client, the whole "protocol" (e.g. our sequence of
requests and responses in a given order) executes perfectly and without
errors. If we run several clients sequentially, everything is OK too - all
clients finish successfully, and the server stays alive listening for
further requests. However, when testing with several concurrent clients,
this is what happens: the server *at first* seems to be able to handle
requests from all of the clients, but as soon as some client successfully
finishes, the server exits with error: An error ocurred: rpc error: code =
Canceled desc = context canceled. All other clients subsequently get the
EOF error and exit.
Each of our clients maintains its own connection to the gRPC server (this
is on purpose, as we want to simulate clients on different physical nodes) as
well as its own client stream. We are passing context.Background() to the
client's ExecuteProtocol call, and the client never explicitly closes
either its stream, or its connection to the gRPC server.
Can anyone help us with this? Could this be due to an issue in our design
of the RPC service, since we assumed that the server can maintain several
concurrent streams for separate clients? We're all fairly new to Go and
gRPC, and I hope this question is not too generic - implementation of
MyProtocolServer and MyProtocolClient was intentionally left out here. I
will, of course, provide more details and code if you think it will help.
Thanks in advance!
Best regards
--
You received this message because you are subscribed to the Google Groups
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/grpc-io.
To view this discussion on the web visit
https://groups.google.com/d/msgid/grpc-io/e12ff2b2-1fab-46f4-995b-6f56488df5c7%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.