【问题标题】:How to re-establish grpc bidirectional stream if internet connection is down如果互联网连接断开,如何重新建立 grpc 双向流
【发布时间】:2023-01-05 00:49:35
【问题描述】:

我正在使用与 grpc 双向流连接的 go 客户端和服务器。我需要该流在没有任何断开连接的情况下永久运行,但当互联网中断时,该流会在 3 分钟内断开连接。有什么方法可以阻止客户端断开连接,或者有什么方法可以在互联网中断时自动重新连接到服务器。如果是这样,请指导我。谢谢你。

【问题讨论】:

  • 如果网络出现故障,则流将下降。当您收到错误消息时(通常是io.EOF,当连接断开时),您需要重新启动流(只需将其添加到您调用Recv 的循环中)- 示例请参见this answer。如果您仍在苦苦挣扎,请分享您当前的尝试。

标签: go grpc


【解决方案1】:

当 gRPC 连接关闭时,gRPC 客户端连接的状态将是 IDLETRANSIENT_FAILURE。这是我在 Go 中为 gRPC 双向流式传输自定义重新连接机制的示例。首先,我有一个 for 循环来保持重新连接,直到 gRPC 服务器启动,在调用 conn.Connect() 后状态将变为就绪。

for {
    select {
    case <-ctx.Done():
        return false
    default:
            if client.Conn.GetState() != connectivity.Ready {
                client.Conn.Connect()
            }

            // reserve a short duration (customizable) for conn to change state from idle to ready if grpc server is up
            time.Sleep(500 * time.Millisecond)

            if client.Conn.GetState() == connectivity.Ready {
                return true
            }

            // define reconnect time interval (backoff) or/and reconnect attempts here
            time.Sleep(2 * time.Second)
    }
}

此外,将生成一个 goroutine 以执行重新连接任务。成功重新连接后,它将生成另一个 goroutine 来监听 gRPC 服务器。

for {
    select {
    case <-ctx.Done():
        return
    case <-reconnectCh:
        if client.Conn.GetState() != connectivity.Ready && *isConnectedWebSocket {
            if o.waitUntilReady(client, isConnectedWebSocket, ctx) {
                err := o.generateNewProcessOrderStream(client, ctx)
                if err != nil {
                    logger.Logger.Error("failed to establish stream connection to grpc server ...")
                }

                // re-listening server side streaming
                go o.listenProcessOrderServerSide(client, reconnectCh, ctx, isConnectedWebSocket)
            }
        }
    }
}

请注意,监听任务由另一个 goroutine 并发处理。

// listening server side streaming
go o.listenProcessOrderServerSide(client, reconnectCh, websocketCtx, isConnectedWebSocket)

您可以查看我的代码示例here。希望这可以帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2018-08-22
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多