存根的 gRPC 并发

gRPC Concurrency for Stubs

在 gRPC 中,我想了解有关服务器处理请求方式的更多信息。

请求是并行执行的吗?或者服务器是否为每个请求生成一个新线程,并并行执行它们?有没有办法修改此行为?我知道在客户端流式 rpc 中,消息顺序是有保证的。

理想情况下,我想向服务器发送请求,服务器确认收到请求,然后将请求添加到队列中以按顺序处理,returns 收到响应后处理。我正在探索的一种方法是使用外部任务队列(如 RabbitMQ)对服务完成的工作进行排队,但我想知道是否有更好的方法。

另外——在某种程度上相关的说明——gRPC 是否具有本机重试计数器机制?我有一个特别容易出错的 RPC,在它成功之前可能必须重试多达 3 次(重试之间有任意延迟)。这也可以用 RabbitMQ 实现。

grpc-java 使用 ServerBuilder.executor(Executor) 提供的 Executor 将 RPC 传递给服务,如果没有提供执行程序,则使用 cached thread pool

同时进行的 RPC 之间没有顺序。 RPC 可以按任何顺序到达。

您可以使用服务器流式 RPC 来允许服务器响应两次,一次用于确认,一次用于完成。您可以在响应消息中使用 oneof 以允许发送两个不同的响应。

grpc-java 作为实验性重试支持。 gRFC A6 describes the support. The configuration is delivered to the client via service config. Retries are disabled by default, so overall you would want something like channelBuilder.defaultServiceConfig(serviceConfig).enableRetry(). You can also reference the hedging example 这与重试非常相似。