前言
本文解读sentinel中涉及到集群限流的相关参数。
一、集群流控参数
1.参数说明
当流控规则FlowRule#clusterMode设置为true时,开启集群流控。集群流控ClusterFlowConfig属性如下。
属性 | 说明 |
flowId | 全局唯一标识 |
thresholdType | 0:单机均摊,1:全局阈值,默认为单机均摊 |
fallbackToLocalWhenFail | 集群流控失败是否降级为单机流控,默认true |
strategy | 策略目前只支持普通策略0 |
sampleCount | 滑动窗口统计采样窗口数量,默认10个 |
windowIntervalMs | 滑动窗口大小,默认1秒 |
2.生效方式
集群流控的生效与其他规则生效方式相同,例如:
流控动态加载:FlowRuleManager#register2Property
热点动态加载:ParamFlowRuleManager.register2Property
示例见:DemoClusterInitFunc#initDynamicRuleProperty()
二、client/server数据格式
集群流控中,client、server的数据组织格式,对应为ClusterGroupEntity的属性。
ClusterGroupEntity的属性
属性 | 说明 |
machineId | server节点,格式为:112.12.88.68@8728 |
ip | server IP |
port | server 端口 |
clientSet | client节点集合,格式为:["112.12.88.66@8729","112.12.88.67@8727"] |
[
{
"clientSet": [
"112.12.88.66@8729",
"112.12.88.67@8727"
],
"ip": "112.12.88.68",
"machineId": "112.12.88.68@8728",
"port": 11111
}
]
三、token client配置参数
当前token client配置参数当前主要为requestTimeout,即:请求超时时间。
1.参数说明
属性 | 说明 |
requestTimeout | 请求超时时间,默认20毫秒。超时会抛出”request time out“的异常SentinelClusterException |
2.生效方式明
动态加载:ClusterClientConfigManager.registerClientConfigProperty
示例见:DemoClusterInitFunc#initClientConfigProperty()
3.实现方式
通过动态监听ClusterClientConfig变更,更新ClusterClientConfigManager#requestTimeout。在netty客户端NettyTransportClient发请求时promise.await使用。
四、token server地址与端口
当token server的IP和端口变更时,token client需要重新连接到新的server地址。
1.参数说明
server的地址和端口通过ClusterClientAssignConfig属性设置。
属性 | 说明 |
serverHost | server IP |
serverPort | server 端口 |
2.生效方式
动态加载:ClusterClientConfigManager.registerServerAssignProperty
示例见:DemoClusterInitFunc#initClientServerAssignProperty()
3.实现方式
token client(DefaultClusterTokenClient)在初始化时,注册server变更观察者。当变更时,通过ClientAssignPropertyListener回调观察者,完成新server的重连。
五、token server端口与空闲时间
当token server参数主要是端口和空闲时间变化,需要重启server。
1.参数说明
ServerTransportConfig属性如下:
属性 | 说明 |
port | server端口 |
idleSeconds | client连接空闲,默认10分钟。超过后会关闭连接 |
2.生效方式
ClusterServerConfigManager.registerServerTransportProperty
示例见:DemoClusterInitFunc#initServerTransportConfigProperty()
3.实现原理
token server(SentinelDefaultTokenServer)在初始化时,注册ServerTransportConfig变更观察者,当配置发生变更时,通过ServerGlobalTransportPropertyListener回调观察者,完成token server端口或者空时间的变更,端口变更需要重启服务端。
六、client/server角色切换
集群流控使用内嵌模式时,client/server可能会在应用的节点之间切换。
1.生效方式
ClusterStateManager.registerProperty
示例见:DemoClusterInitFunc#initStateProperty()
2.实现原理
通过动态监听cluster集群节点变化,通过ClusterStatePropertyListener中提供的setToClient、setToServer实现角色切换。
七、namespace变更
集群流控中使用namespace的概念,通常为appName,可以动态监听一组namespace的变化。通过ClusterFlowRuleManager.setPropertySupplier加入监听,并通过FlowRulePropertyListener#applyClusterFlowRule生效。构建namespace、flowId、FlowRule、flowIdSet在缓存中的关系以及为每个flowId准备集群流控统计ClusterMetric,
示例详见:DemoClusterInitFunc#registerClusterRuleSupplier。
与丁威老师一起写的专栏《RocketMQ实战与进阶》,均为多年实战心得总结,有需要的同学可以读读看。
作者丨梁勇
来源丨瓜农老梁
欢迎关注公众号「瓜农老梁」
「瓜农老梁 学习同行」