RPC呼叫超時中斷機制的實現

2021-09-29 15:35:15 字數 2032 閱讀 9447

在如今網際網路的架構趨勢下,微服務已經成為乙個不可或缺的服務架構了。將乙個大的服務拆分若干子服務,然後遠端呼叫,已應對大流量、高併發的系統場景,如今開源的優秀rpc框架很多,例如 thrift、dubbo 、grpc等

本人公司也有兩套自主研發的rpc框架,通讀之後受益匪淺,下面分享一下,遠端呼叫第三方服務超時中斷機制的實現。在呼叫第三方服務時,如果服務提供方處理過於緩慢,會拖垮呼叫方,使呼叫方夯住,所以呼叫超時中斷機制很有必要,是保證服務的可用性的重要手段

典型的微服務專案,一次使用者請求,可能在後台的呼叫流程會歷經多個服務,每個服務的可靠性是整個呼叫流程的前提

客戶端呼叫服務端流程:

本文不再過多的講解rpc呼叫流程,直接講解客戶端呼叫超時中斷的**實現。

原理也不複雜,利用reentrantlock的condition進行等待阻塞,等待相應的超時時間後,發現依然沒有收到服務端的響應結果後,判斷為超時!

**實現:

首先定義乙個netty客戶端,用於請求服務端,獲取返回結果

public class invokerclient 

});channelfuture cf = bootstrap.connect("127.0.0.1", 3344).sync();

channel = cf.channel();

}//請求服務端

public object call(request request)

}

其中request是請求引數,裡面有timeout超時時間,以及向服務端請求的引數
public class request 

public request setobject(object object)

public string getseq()

public long gettimeout()

public request settimeout(long timeout)

}

核心的requesttask類,用於接受服務端的返回結果,超時中斷

public class requesttask 

return response;

}} catch (interruptedexception e) finally

}return response;

}public requesttask setresponse(object response) finally

return this;

}public boolean isdone()

public requesttask setdone(boolean done)

}

receivehandle客戶端接收到服務端的響應結果處理handle
public class receivehandle extends ******channelinboundhandler 

}

requestfactory請求工廠

public class requestfactory 

public static requesttask get(string uuid)

}

注: 本人利用業餘時間手寫了一套輕量級的rpc框架,裡面有用到

C語言底層呼叫的實現機制

call指令其實隱式完成了乙個push操作,把下一條語句的位址push進了堆疊,當然是在引數之後被push進堆疊。為了保持堆疊平衡,就要有乙個pop相對應,這個pop在函式退出的時候由ret指令完成,類似於call,ret隱式完成了乙個pop操作,把call壓入堆疊的位址pop出去,然後回到了這個位...

linux的系統呼叫是用中斷實現的

linux的 系統呼叫是用中斷實現的 linux的系統呼叫並不是像普通的函式呼叫那樣直接在使用者程序空間完成的,它是通過中斷實現的,即 發出中斷 呼叫中斷服務程式。www.2cto.com 以x86體系為例,1.使用者程序在執行系統呼叫前,先把系統呼叫名 實際上是系統呼叫號 輸入引數等放到暫存器上 ...

C 非同步呼叫的實現機制及呼叫方法

對於非同步呼叫,net內部究竟做了什麼?sleep 的非同步呼叫會在乙個單獨的執行緒內執行,這個執行緒來自於.net執行緒池。net執行緒池預設包含25個執行緒,你可以改變這個值的上限,每次非同步呼叫都會使用其中某個執行緒執行,但我們並不能控制具體使用哪乙個執行緒。自我總結 只有非同步呼叫 不包含控...