1箩艺、thrift無法判斷連接失效
問題
使用thrift進行內(nèi)部服務調(diào)用時,一般使用連接池的方式來減少連接頻繁創(chuàng)建銷毀產(chǎn)生的開銷宪萄。thrift是無法判斷連接是否有效的艺谆。
thrift判斷是否有效。判斷連接是否有效拜英,使用TTransport類的isOpen()函數(shù)進行判斷静汤,isOpen()函數(shù)的源碼中使用了jdk中Socket類的isConnected()方法判斷。
jdk源碼如下:
/**
* Returns the connection state of the socket.
*
* Note: Closing a socket doesn't clear its connection state, which means
* this method will return {@code true} for a closed socket
* (see {@link #isClosed()}) if it was successfuly connected prior
* to being closed.
*
* @return true if the socket was successfuly connected to a server
* @since 1.4
*/
public boolean isConnected() {
? ? // Before 1.3 Sockets were always connected during creation
? ? return connected ||oldImpl;
}
所以,isConnected方法得到的并不是Socket的當前連接狀態(tài)虫给,而是只要是Socket連接曾經(jīng)成功過藤抡,isConnected始終返回true。
thrift并沒有提供一個可以獲取當前連接狀態(tài)的方法抹估。
解決方案
? ? 1缠黍、連接池中對象的active時間與server端的socket超時一致,避免獲取到被關(guān)閉的連接(我們使用的方案)药蜻。
? ? 2瓷式、遠程調(diào)用操作失敗后,講失敗狀態(tài)寫入當前客戶端變量谷暮,下次校驗時蒿往,查看此變量,獲取連接狀態(tài)湿弦,銷毀重連瓤漏。這樣導致的結(jié)果是異常連接總會失敗一次,當連接池中緩存的異常連接過多颊埃,會造成過多的業(yè)務請求失敗蔬充。
? ? 3、各個服務thrift服務端統(tǒng)一新增接口函數(shù)ping(),不做任何操作班利,用來進行連接池校驗饥漫。