java - stub 的 gRPC 并发

标签 java concurrency microservices grpc grpc-java

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

请求是否并行执行?或者服务器是否为每个请求生成一个新线程,并并行执行它们?有没有办法改变这种行为?据我了解,在客户端流式 RPC 中,消息顺序是得到保证的。

  • 如果我将请求 A 和请求 B 发送到同一个 RPC,是否可以保证 A 在 B 开始处理之前先执行?或者它们各自有自己的线程并并行执行,但不能保证 A 在 B 之前完成。

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

此外,在某种程度上相关的说明上,gRPC 是否有 native 重试计数器机制?我有一个特别容易出错的 RPC,可能需要重试最多 3 次(重试之间有任意延迟)才能成功。这也可以使用 RabbitMQ 来实现。

最佳答案

grpc-java 使用 ServerBuilder.executor(Executor) 提供的 Executorcached thread pool 将 RPC 传递给服务。如果没有提供执行者。

同时 RPC 之间没有顺序。 RPC 可以按任意顺序到达。

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

grpc-java 作为实验性重试支持。 gRFC A6描述了支持。配置通过服务配置传递给客户端。默认情况下禁用重试,因此总的来说,您需要类似 channelBuilder.defaultServiceConfig(serviceConfig).enableRetry() 的内容。您还可以引用hedging example这与重试非常相似。

关于java - stub 的 gRPC 并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60832849/

相关文章:

java - Android Intent/IntentService 的空指针异常

java - 并发HashMap线程安全和happens-before关系

java - 用java设置音量

java - spring中TaskExecutor的用途是什么?

concurrency - INRIA会向OCaml添加并发原语吗?

java - 与 Java 进程之间的通信是否仍在微服务中?

java - Bukkit Config - 获取分段和安全转换

java - 缓冲迭代器实现

微服务架构中的 Elasticsearch,设计问题

java - 无法连接到 Eureka 服务器。异常 : java.net.ConnectException:连接被拒绝:连接