3

利用划分子集限制连接池的大小(2)

 2 years ago
source link: http://vearne.cc/archives/39580
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | http://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的连接池可能会频繁的发生销毁和创建,这不得不引起我们的重视。不过好在发布动作在服务运行的整个生命周期占比不大。

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

连接数大概下降了30%

常驻内存大概下降40%

协程数下降30%

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

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


微信支付码


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK