gRPC 的 RPC 语义

RPC semantics of gRPC

我正在尝试找出 gRPC 库提供的 RPC 语义?至多一次吗?它能保证客户端发出的 RPC 调用不会在服务器上执行多次吗?我在文档的任何地方都找不到明确提到的内容。

据我了解,gRPC 通道具有基于指数退避的重试机制,可在瞬态故障后重新启动 TCP 连接。因此,如果服务器在执行 RPC 调用之后但在响应之前失败,然后又恢复正常,则客户端 RPC 最终可能会执行两次。

有人可以对此进行更多说明吗?

gRPC 默认提供至多一次保证。重试之类的事情可以改变这一点,但他们是选择加入的。另一个例子是标记你的 RPC idempotent or no-side-effects;您已明确告诉 gRPC 可以重播 RPC。

gRPC 也可以在其他地方保证 RPC 未被处理时重播。我们称之为 transparent retries,我们现在正在实施,它基于 HTTP/2 语义,其中服务器告诉我们 RPC 未被服务应用程序看到。

gRPC 对重新连接(不是重试 RPC)的指数退避不会改变行为。当连接已知为错误时,普通 RPC 会彻底失败,但尚未发送的等待就绪 RPC 会被简单地延迟,直到连接就绪。没有"replay"涉及的RPC;它只发送一次。

From what I understand, gRPC channels have an exponential back-off based retry mechanism of re-initiating TCP connections after transient failures.

我认为 GRPC 客户端非常灵活,您可以尝试使用 https://godoc.org/google.golang.org/grpc#FailOnNonTempDialError

禁用重试

尽管您必须自己关心重试。