首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gRPC-go服务器无响应,并在一段时间后开始备份请求

gRPC-go服务器无响应,并在一段时间后开始备份请求
EN

Stack Overflow用户
提问于 2020-12-13 11:30:22
回答 1查看 100关注 0票数 0

我们有一个公共的gRPC接口。我们有一个客户端,它基于为每个请求创建一个连接(通道)的REST范例来使用我们的API。我们怀疑一旦发出请求,他们就不会关闭此通道。

在服务器端,所有功能都正常运行了一段时间,然后似乎有些功能耗尽了。请求在服务器上备份并且不被处理-这会导致我们的代理超时并发送不可用的响应。重新启动服务器解决了这个问题,我可以在服务器关闭时在日志中看到备份的请求被刷新。

不幸的是,似乎没有办法监控服务器端正在发生的事情并修剪这些连接。我们有以下keep alive设置,但它们似乎没有影响:

代码语言:javascript
复制
grpc.KeepaliveParams(keepalive.ServerParameters{
        MaxConnectionIdle:     time.Minute * 5,
        MaxConnectionAge:      time.Minute * 15,
        MaxConnectionAgeGrace: time.Minute * 1,
        Time:    time.Second * 60,
        Timeout: time.Second * 10,
    })

我们还尝试将MaxConcurrentStreams从默认的250升级到1000,但是pod是我们可以在服务器端监控通道创建、使用和破坏的任何方法-如果只是为了证明或反驳客户端的消费方法导致了问题。

详细日志记录没有帮助,因为它似乎只记录服务器上的客户端活动(即,服务器使用发布/订阅并作为客户端进行日志记录)。我也看过一个通道,但我们有共同的TLS身份验证,我一直没有成功地让它在我们的生产pod上工作。

我们已经指示我们的客户使用单一渠道,如果这是不可能的,关闭他们正在创建的渠道,但他们是一家公司,行动非常缓慢。我们也无法检查他们的代码。我们只知道他们是用dotnet开发的。我们也无法复制以类似数量运行我们自己的go客户端的行为。

EN

回答 1

Stack Overflow用户

发布于 2021-04-26 04:27:31

这个漏洞是MaxConnectionIdle,它总是会在指定的时间后创建一个新的http2server,最终你的服务会因为goroutine泄漏而崩溃。

删除MaxConnectionIdleMaxConnectionAge,然后(最好)确保ServerParametersClientParameters使用相同的TimeTimeout

代码语言:javascript
复制
        const (
            Time    = 5 * time.Second // wait X seconds, then send ping if there is no activity
            Timeout = 5 * time.Second // wait for ping back
        )

        // server code...
        grpc.KeepaliveParams(keepalive.ServerParameters{
            Time:                  Time,
            Timeout:               Timeout,
            MaxConnectionAgeGrace: 10 * time.Second,
        })

        // client code...
        grpc.WithKeepaliveParams(keepalive.ClientParameters{
            Time:                Time,
            Timeout:             Timeout,
            PermitWithoutStream: true,
        }),
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65272088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档