java面經-訊息佇列-阻塞與非阻塞-同步與非同步
阿新 • • 發佈:2022-04-12
一、“阻塞”與“阻塞”與“同步”與“非同步”
1、同步與非同步
同步與非同步關注的是訊息通訊機制(synchronous communication/ asynchronous communication)
所謂同步,就是在發出一個‘呼叫’時,在沒有得到結果之前,該‘呼叫’就不返回。但是一旦呼叫返回,就得到了返回值。換句話說就是由'呼叫者'主動等待這個結果。
所謂非同步,就在呼叫發出以後,這個呼叫就直接返回了,所以沒有結果。換句話說,當一個非同步過程呼叫發出後,呼叫者不會立刻得到結果。而是在‘呼叫’發出後,被呼叫者通過狀態通知呼叫者,或者回調函式處理這個呼叫。
例子1:
你打電話問書店老闆有沒有《而非同步通訊機制,書店老闆直接告訴你我查一下啊,查好了打電話給你,然後直接掛電話了(不返回結果)。然後查好了,他會主動打電話給你。在這裡老闆通過“回電”這種方式來回調。
2、阻塞與非阻塞
阻塞和非阻塞關注的是等待呼叫結果(訊息,返回值)的狀態
阻塞呼叫是指呼叫結果返回之前,該執行緒會被掛起。呼叫執行緒只有在得到結果才會返回。
非阻塞呼叫不能立刻得到結果之前,該呼叫不會阻塞當前執行緒。
總結:阻塞與非阻塞著重於等待呼叫結果的狀態(是否阻塞當前執行緒),同步與非同步主要著重於等待結果。
例子2:
你打電話問書店老闆有沒有《分散式系統》這本書,你如果是阻塞式呼叫,你會一直把自己“掛起”,直到得到這本書有沒有的結果,如果是非阻塞式呼叫,你不管老闆有沒有告訴你,你自己先一邊去玩了, 當然你也要偶爾過幾分鐘check一下老闆有沒有返回結果。在這裡阻塞與非阻塞與是否同步非同步無關。跟老闆通過什麼方式回答你結果無關。
使用訊息佇列的好處: 1、將使用者的請求資料儲存到訊息佇列之後(生成),就立即返回結果。隨後系統再對訊息佇列進行消費。(提高使用者體驗) 因為使用者請求資料寫入訊息隊列了就立即返回給使用者了,但是請求資料在後續的業務校驗、寫資料庫等操作中可能會失敗。因此,使用訊息佇列進行非同步處理之後,需要適當修改業務流程進行配合