thrift無法判斷連線失效的原因與解決方案

2021-07-26 06:00:18 字數 964 閱讀 2911

公司的軟體系統使用thrift來進行系統內部各服務的溝通呼叫。thrift客戶端採用了連線池的方式減少連線頻繁建立銷毀產生的開銷。連線池之前一直存在無法即時判斷連線是否有效的問題。今天抽空看了下thrift的原始碼,分析出原因如下:

我們在程式中判斷連線是否有效時,呼叫的是

ttransport類的isopen()函式

一路除錯跟蹤檢視

ttransport的isopen()原始碼,得到如下:

即最終呼叫的是jdk中 socket類的isconnected()方法

根據原始碼中的英文注釋內容及網上的資料,得出答案:

isconnected方法得到的並不是socket的當前連線狀態,而是只要是socket連線曾經成功過,isconnected始終返回true。

thrift並沒有提供乙個可以獲取當前連線狀態的方法。

之前連線池的解決方案是:在當前遠端呼叫操作失敗後,將失敗狀態寫入當前客戶端類變數,下次校驗時,檢視此變數,獲取連線狀態,銷毀重連。這樣導致的結果是異常連線總會失敗一次,當連線池中快取的異常連線過多,就會造成過多的業務請求失敗,且單獨服務的重啟操作需要也重啟依賴此服務的程式,避免失敗,很麻煩。

這次採用的解決方案為:各個服務thrift服務端統一新增一介面函式,名為ping()(或其他名稱),ping()函式中什麼也不操作。這樣連線池在校驗連線時,統一呼叫各服務的ping()即可精確得知連線狀態(呼叫ping()失敗即連線異常,呼叫成功即連線正常)。由於ping()為空,不進行任務業務操作,對服務端造成的壓力也會很小。

MySQL的無法連線故障

本地機裝了好多整合伺服器環境,有phpnow aawserver和apmserv,在最後確定使用apmserv的時候發現mysql無法連線。在網上搜了好多解決方案後無果,覺得應該是另有隱情,檢視系統服務,mysql正常啟動,apmserv也提示無異樣,百思不得其解,睡一覺起來後,突發奇想,看看系統服...

索引優化的常用方法以及失效判斷

explain簡介 全值匹配最好 最佳左字首原則 查詢無法使用索引範圍條件右邊的列 盡量使用覆蓋索引,也就是只查詢建立索引的字段,減少 的使用 mysql中,在使用!這兩個符號的時候,索引會失效 is null is not null 也會索引失效 用like模糊查詢,如果以 xx 開頭,也會索引失...

putty 無法連線ubuntu的問題

檢視ssh是否已安裝,如未安裝執行 sudo apt get install openssh server 然後確認sshserver是否啟動了 ps e grep ssh如果只有ssh agent那ssh server還沒有啟動,需要 etc init.d ssh start,如果看到sshd那說...