登录
首页 >  Golang >  Go问答

重建 grpc 双向流连接的方法

来源:stackoverflow

时间:2024-03-13 23:27:27 245浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《重建 grpc 双向流连接的方法》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我正在使用 go 客户端和服务器,它们通过 grpc 双向流连接。我需要该流永远长时间运行而不会断开连接,但当互联网中断时,该流会在 3 分钟内断开连接。有什么方法可以阻止客户端断开连接,或者有什么方法可以在互联网关闭时自动重新连接到服务器。如果是这样,请指导我。谢谢。


正确答案


当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。希望这会有所帮助。

理论要掌握,实操不能落!以上关于《重建 grpc 双向流连接的方法》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>