Fork me on GitHub

版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | https://vearne.cc

2.3 连接池的变化情况

如果采用确定性算法来划分子集还需要考虑在有节点宕机或者Backend进行过滚动升级的情况下,引起的连接池中连接的变化情况。

这里先上结论,要保证连接池中的连接不大量的销毁和创建,Backend也需要绑定backendID,以确保对于每个Client选出的子集不发生重大的变化

绑定backendID确保调用Subset时,Backend在backends中的位置不发生变化。(绑定backendID可以利用分布式锁来实现)

func Subset(backends []string, clientID, subsetSize int) 

我们来看一个反例,假定某个Backend backend-10实例宕机,连接池的变化情况
subset/certainty4/verify.go

结果

所有连接数:2500, 重建的连接总数:1257, 百分比: 50.280000 %

因为一个实例宕机,整个集群的连接池中一半的连接都要重新销毁,重连一次,开销还是非常大的。大家都知道集群做滚动发布,持续时间可能长达数分钟。也就是在这数分钟内Client的连接池可能会频繁的发生销毁和创建,这不得不引起我们的重视。不过好在发布动作在服务运行的整个生命周期占比不大。

3. 效果

最后我们来看下,使用划分子集方案后,带来的实际效果

连接数大概下降了30%

常驻内存大概下降40%

协程数下降30%

令人惊喜的是,GC耗时也有了一定程度的下降

总结

使用划分子集的方案来限制连接池的大小确实有不俗的效果,但也要注意细节和风险点。河豚虽然美味,但也有可能有毒。

参考资料

  1. 用subsetting 限制连接池中的连接数量
  2. load balancing datacenter/

微信公众号

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注