thrift使用的坑

1、thrift無(wú)法判斷連接失效

問(wèn)題

使用thrift進(jìn)行內(nèi)部服務(wù)調(diào)用時(shí),一般使用連接池的方式來(lái)減少連接頻繁創(chuàng)建銷(xiāo)毀產(chǎn)生的開(kāi)銷(xiāo)。thrift是無(wú)法判斷連接是否有效的。

thrift判斷是否有效。判斷連接是否有效,使用TTransport類(lèi)的isOpen()函數(shù)進(jìn)行判斷,isOpen()函數(shù)的源碼中使用了jdk中Socket類(lèi)的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的當(dāng)前連接狀態(tài),而是只要是Socket連接曾經(jīng)成功過(guò),isConnected始終返回true。

thrift并沒(méi)有提供一個(gè)可以獲取當(dāng)前連接狀態(tài)的方法。

解決方案

? ? 1、連接池中對(duì)象的active時(shí)間與server端的socket超時(shí)一致,避免獲取到被關(guān)閉的連接(我們使用的方案)。

? ? 2、遠(yuǎn)程調(diào)用操作失敗后,講失敗狀態(tài)寫(xiě)入當(dāng)前客戶(hù)端變量,下次校驗(yàn)時(shí),查看此變量,獲取連接狀態(tài),銷(xiāo)毀重連。這樣導(dǎo)致的結(jié)果是異常連接總會(huì)失敗一次,當(dāng)連接池中緩存的異常連接過(guò)多,會(huì)造成過(guò)多的業(yè)務(wù)請(qǐng)求失敗。

? ? 3、各個(gè)服務(wù)thrift服務(wù)端統(tǒng)一新增接口函數(shù)ping(),不做任何操作,用來(lái)進(jìn)行連接池校驗(yàn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 線(xiàn)上服務(wù),在使用thrift的過(guò)程中,客戶(hù)端會(huì)不定時(shí)出現(xiàn)一些org.apache.thrift.transport...
    張乃斌閱讀 6,089評(píng)論 1 2
  • 簡(jiǎn)單的說(shuō)就是: 1.先連接登錄服務(wù)器進(jìn)行驗(yàn)證 2.登錄驗(yàn)證成功后連接游戲服務(wù)器,后面就是游戲包的流程了 先說(shuō)lua...
    Mark86閱讀 2,783評(píng)論 0 0
  • 本文主要從IO模型、Netty邏輯架構(gòu)、Netty各組件的設(shè)計(jì)與應(yīng)用為主導(dǎo),由簡(jiǎn)-難-細(xì)展開(kāi)來(lái)介紹,其中包括IO模...
    RalapHao閱讀 2,070評(píng)論 2 14
  • # Java NIO # Java NIO屬于非阻塞IO,這是與傳統(tǒng)IO最本質(zhì)的區(qū)別。傳統(tǒng)IO包括socket和文...
    Teddy_b閱讀 717評(píng)論 0 0
  • Zookeeper用于集群主備切換。 YARN讓集群具備更好的擴(kuò)展性。 Spark沒(méi)有存儲(chǔ)能力。 Spark的Ma...
    Yobhel閱讀 7,602評(píng)論 0 34

友情鏈接更多精彩內(nèi)容