【问题标题】:RPC semantics of gRPCgRPC 的 RPC 语义
【发布时间】:2018-04-24 15:15:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: rpc grpc distributed-system


    【解决方案1】:

    gRPC 默认提供最多一次保证。重试和类似的事情可以改变这一点,但它们是可选的。另一个例子是标记你的 RPC idempotent or no-side-effects;你已经明确告诉 gRPC 可以重放 RPC。

    如果在其他地方提供了 RPC 未处理的保证,gRPC 也可能会重播。我们称之为transparent retries,我们现在正在实现它,它基于 HTTP/2 语义,服务器告诉我们服务应用程序看不到 RPC。

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

    【讨论】:

      【解决方案2】:

      据我了解,gRPC 通道具有基于指数回退的重试机制,可在瞬时失败后重新启动 TCP 连接。

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

      虽然您必须自己关心重试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-26
        • 2015-07-18
        • 2020-10-11
        • 1970-01-01
        • 2021-05-19
        相关资源
        最近更新 更多