我們知道,dubbo 預設協議採用單一長連線,底層實現是 netty 的 nio 非同步通訊機制;基於這種機制,dubbo 實現了以下幾種呼叫方式:
同步呼叫是一種阻塞式的呼叫方式,即 consumer 端**一直阻塞等待,直到 provider 端返回為止;
通常,乙個典型的同步呼叫過程如下:
consumer 業務執行緒呼叫遠端介面,向 provider 傳送請求,同時當前執行緒處於阻塞
狀態;
provider 接到 consumer 的請求後,開始處理請求,將結果返回給 consumer;
consumer 收到結果後,當前執行緒繼續往後執行。
這裡有 2 個問題:
consumer 業務執行緒是怎麼進入阻塞
狀態的?
consumer 收到結果後,如果喚醒業務執行緒往後執行的?
其實,dubbo 的底層 io 操作都是非同步的。consumer 端發起呼叫後,得到乙個 future 物件。對於同步呼叫,業務執行緒通過future#get(timeout)
,阻塞等待 provider 端將結果返回;timeout
則是 consumer 端定義的超時時間。當結果返回後ÿ
同步呼叫與非同步呼叫
一 什麼是同步呼叫與非同步呼叫 定義 1 同步就是整個處理過程順序執行,當各個過程都執行完畢,並返回結果。2 非同步呼叫則是只是傳送了呼叫的指令,呼叫者無需等待被呼叫的方法完全執行完畢 而是繼續執行下面的流程。例如,在某個呼叫中,需要順序呼叫 a,b,c三個過程方法 如他們都是同步呼叫,則需要將他們...
dubbo非同步呼叫的bug
現象 現有3個服務,關係如下,servicea非同步呼叫serviceb,serviceb同步呼叫servicec。其中serviceb暴露出的介面為非同步方式。表現的現象為,serviceb每次呼叫servicec時,第一次的返回結果為null,後面幾次呼叫時均能正常返回結果。問題排查 專案中對於...
ajax同步非同步呼叫
test.html asy.js function testasync success function data alert temp end tet.php echo here is html code sleep 5 async false,預設是true 如上 false為同步,這個 tes...