网络连接
概述
北极星go sdk做为业务层代码调用北极星服务能力的中间层,为业务层抽象了服务、配置、限流相关的接口能力,使业务层不需要感知和管理与北极星服务端的连接。本文介绍北极星go sdk网络连接管理的内部实现机制和相关配置项,为业务研发和运维优化提供参考。
本文试图回答的场景问题:
- 北极星SDK与北极星服务端有哪些连接
- 这些连接断开或超时异常时,会触发什么问题和现象
- 我们需要关注哪些连接相关的配置项,应该在哪些场景进行调整
连接分类
服务连接(Register)
服务注册反注册、路由规则、负载均衡、熔断、健康检查等业务能力使用服务连接
连接地址
配置项 global.serverConnector.address
连接分类
长连接
- 客户端调用服务发现(Disover)接口发起长连接,并周期性发起针对某项数据的监听任务;当超过配置项
consumer.localCache.serviceExpireTime
(默认24小时)后没有访问该项数据,则停止该周期性监听任务;当长连接中没有任何监听任务,超过global.serverConnector.connectionIdleTimeout
(默认3s)时长没有访问流量后,长连接会断开,由下一次查询重新发起;
短链接
- 非周期性:服务注册(Register)/反注册(DeRegister)发起,调用结束后关闭
- 周期性:上报客户端(ReportClient)接口定时向服务端上报客户端信息,上报动作发起的定时周期由
global.api.reportInterval
(默认2分钟) 配置项规定,;每个SDKContext运行一个周期性上报客户端协程,通常使用场景下每个业务客户端运行一个全局SDKContext - 周期性:服务注册后,需要周期性向Server端发起心跳(HeartBeat),更新Server端记录的服务实例的心跳时间;心跳动作会发起短链接,更新完成后关闭;心跳动作发起的周期为服务注册参数中的TTL时间,默认为5秒
配置连接(Configuration)
客户端对配置文件、配置分组相关的操作使用配置连接
连接地址
配置项 config.configConnector.address
连接分类
短连接
- 非周期性:客户端对配置的增删改成接口均会发起短链接,在接口操作完成后关闭
限流连接(RateLimiter)
客户端对限流接口的调用使用限流连接
连接地址
配置项 provider.rateLimit.limiterNamespace
(默认为Polaris) 和 provider.rateLimit.limiterService
(默认为polaris.limiter) 注册的后端服务
连接分类
长连接
- 客户端调用限流接口(GetQuota)查询发起长连接,超过配置项
provider.rateLimit.purgeInterval
(默认1分钟)时长没有调用访问Quota数据时,会发起闲置检查;闲置连接检查超过global.serverConnector.connectionIdleTimeout
(默认3秒)时长没有访问流量后,长连接会断开,由下一次查询重新发起
监控连接(StatReporter)
客户端上报服务调用结果相关的监控数据
连接地址
配置项 global.statReporter.plugin.prometheus.address
连接分类
短连接
- 周期性:客户端启动后,定时间隔上报服务调用、路由、限流结果等监控数据。
连接信息汇总
相关配置汇总
配置项:global.serverConnector.connectTimeout
说明:服务客户端连接服务端同步请求超时时间
默认值:500毫秒
配置项:global.serverConnector.messageTimeout
说明:服务客户端接受服务端异步消息超时时间
默认值:1500毫秒
配置项:global.serverConnector.connectionIdelTimeout
说明:服务连接闲置连接超时时间
默认值:3秒
配置项:global.serverConnector.reconnectInterval
说明:服务客户端重连时间间隔
默认值:500毫秒
配置项:global.api.reportInterval
说明:客户端定时上报周期
默认值:2分钟
配置项:consumer.localCache.serviceExpireTime
说明:客户端缓存失效时间
默认值:24小时
配置项:config.configConnector.connectTimeout
说明:配置客户端连接服务端同步请求超时时间
默认值:500毫秒
配置项:config.configConnector.messageTimeout
说明:配置客户端接受服务端异步消息超时时间
默认值:1500毫秒
配置项:config.configConnector.connectionIdelTimeout
说明:配置连接闲置连接超时时间
默认值:3秒
配置项:config.configConnector.reconnectInterval
说明:配置客户端重连时间间隔
默认值:500毫秒
配置项:provider.ratelimit.purgeInterval
说明:限流查询任务超时检查周期
默认值:1分钟
配置项:global.statReporter.plugin.prometheus.interval
说明:监控数据定时上报周期
默认值:1分钟
业务场景Q&A
Q:北极星SDK与北极星服务端有哪些连接
A:正常业务运行情况下,1个服务发现长连接 + 1个限流长连接 + 若干实时打开关闭的短连接,例如:注册一个服务,TTL设置为2秒,操作系统默认TCP MSL 30秒(net.ipv4.tcp_fin_timeout=60) ,则通过 netstat -ano |grep 8091
预期看到 2 个 ESTABLISHED 状态连接 和 30个左右 TIMEOUT 状态连接
Q:这些连接断开或超时异常时,会触发什么问题和现象
A:重点关注:服务发现长连接异常断开后,调用SDK负载均衡、路由等接口不受影响,临时使用缓存数据,直到serviceExpireTime触发缓存数据失效或连接恢复;限流长连接断开后,调用SDK限流接口不受影响,临时退化到单机限流能力直到连接恢复
Q:我们需要关注哪些连接相关的配置项,应该在哪些场景进行调整
A:当客户端与服务端网络条件不稳定时,应适度调整增加以下参数提高容错性:
consumer.localCache.serviceExpireTime
(服务发现连接断开后缓存可用时间)
global.serverConnector.connectTimeout
(服务发现同步gRPC请求超时时间)
global.serverConnector.messageTimeout
(服务发现异步gRPC请求回包超时时间)
config.configConnector.connectTimeout
(配置同步gRPC请求超时时间)
config.configConnector.messageTimeout
(配置异步gRPC请求回包超时时间)