近期我們公司正在對自己的分布式系統(tǒng)進行升級,其中一個重要的組件是dubbo。盡管dubbo在分布式系統(tǒng)中起著很重要的作用,但是我們遇到了一個很大的問題:我們的MySQL連接數(shù)突然暴增。經(jīng)過排查,我們發(fā)現(xiàn)這個問題與我們所使用的dubbo有關(guān),下面我們將詳細分析一下原因。
<dubbo:reference id="userService" interface="com.xxx.UserService" timeout="3000" retries="0" cluster="failover" loadbalance="random" />
我們使用dubbo時,在XML配置文件中常常會出現(xiàn)上面這樣的配置,其中cluster表示調(diào)用服務(wù)失敗時的集群類型,loadbalance則表示負載均衡的算法類型。這些參數(shù)會對dubbo內(nèi)部的連接池產(chǎn)生影響,導(dǎo)致連接數(shù)過多。
我們拿loadbalance舉例,當(dāng)我們設(shè)置loadbalance="random"時,dubbo會選擇隨機的一臺服務(wù)提供者來提供服務(wù),而這一過程中就要借助于dubbo連接池中的連接數(shù)。但是,如果提供者數(shù)量非常多,那么連接池使用的連接數(shù)就會增加,從而導(dǎo)致MySQL中的連接數(shù)增加。
因此,為了減少連接數(shù),我們可以調(diào)整連接池的大小,也可以使用其他負載均衡算法。比如,使用輪詢算法loadbalance="roundrobin",則dubbo會依次輪詢服務(wù)提供者,連接池使用的連接數(shù)就會相應(yīng)減少。
<dubbo:reference id="userService" interface="com.xxx.UserService" timeout="3000" retries="0" cluster="failover" loadbalance="roundrobin" connections="20" />
上面這段代碼中,我們在dubbo:reference中增加了connections屬性,表示連接池最大連接數(shù)。通過調(diào)整這個參數(shù)或者使用其他負載均衡算法,我們可以有效減少MySQL連接數(shù),提高系統(tǒng)性能。