首頁技術(shù)文章正文

異步調(diào)用更好嗎?相比同步調(diào)用有哪些優(yōu)勢(shì)?

更新時(shí)間:2023-09-26 來源:黑馬程序員 瀏覽量:

什么是同步調(diào)用什么是異步調(diào)用

微服務(wù)一旦拆分,必然涉及到服務(wù)之間的相互調(diào)用,調(diào)用者發(fā)起請(qǐng)求后需要等待服務(wù)提供者執(zhí)行業(yè)務(wù)返回結(jié)果后,繼續(xù)執(zhí)行后面的業(yè)務(wù)。調(diào)用者在調(diào)用過程中處于阻塞狀態(tài),因此我們成這種調(diào)用方式為同步調(diào)用,也可以叫同步通訊。但在很多場(chǎng)景下,我們可能需要采用異步通訊的方式,我們來看看什么是同步通訊和異步通訊。

同步通訊:就如同打視頻電話,雙方的交互都是實(shí)時(shí)的。因此同一時(shí)刻你只能跟一個(gè)人打視頻電話。

異步通訊:就如同發(fā)微信聊天,雙方的交互不是實(shí)時(shí)的,你不需要立刻給對(duì)方回應(yīng)。因此你可以多線操作,同時(shí)跟多人聊天。

兩種方式各有優(yōu)劣,打電話可以立即得到響應(yīng),但是你卻不能跟多個(gè)人同時(shí)通話。發(fā)微信可以同時(shí)與多個(gè)人收發(fā)微信,但是往往響應(yīng)會(huì)有延遲。

所以,如果我們的業(yè)務(wù)需要實(shí)時(shí)得到服務(wù)提供方的響應(yīng),則應(yīng)該選擇同步通訊(同步調(diào)用)。而如果我們追求更高的效率,并且不需要實(shí)時(shí)響應(yīng),則應(yīng)該選擇異步通訊(異步調(diào)用)。

同步調(diào)用存在三個(gè)問題:

第一,拓展性差 我們目前的業(yè)務(wù)相對(duì)簡(jiǎn)單,但是隨著業(yè)務(wù)規(guī)模擴(kuò)大,產(chǎn)品的功能也在不斷完善。 在大多數(shù)電商業(yè)務(wù)中,用戶支付成功后都會(huì)以短信或者其它方式通知用戶,告知支付成功。假如后期產(chǎn)品經(jīng)理提出這樣新的需求,你怎么辦?是不是要在上述業(yè)務(wù)中再加入通知用戶的業(yè)務(wù)? 某些電商項(xiàng)目中,還會(huì)有積分或金幣的概念。假如產(chǎn)品經(jīng)理提出需求,用戶支付成功后,給用戶以積分獎(jiǎng)勵(lì)或者返還金幣,你怎么辦?是不是要在上述業(yè)務(wù)中再加入積分業(yè)務(wù)、返還金幣業(yè)務(wù)? 。。。 最終你的支付業(yè)務(wù)會(huì)越來越臃腫:

 也就是說每次有新的需求,現(xiàn)有支付邏輯都要跟著變化,代碼經(jīng)常變動(dòng),不符合開閉原則,拓展性不好。

第二,性能下降 由于我們采用了同步調(diào)用,調(diào)用者需要等待服務(wù)提供者執(zhí)行完返回結(jié)果后,才能繼續(xù)向下執(zhí)行,也就是說每次遠(yuǎn)程調(diào)用,調(diào)用者都是阻塞等待狀態(tài)。最終整個(gè)業(yè)務(wù)的響應(yīng)時(shí)長(zhǎng)就是每次遠(yuǎn)程調(diào)用的執(zhí)行時(shí)長(zhǎng)之和,假如每個(gè)微服務(wù)的執(zhí)行時(shí)長(zhǎng)都是50ms,則最終整個(gè)業(yè)務(wù)的耗時(shí)可能高達(dá)300ms,性能太差了。

第三,級(jí)聯(lián)失敗 由于我們是基于OpenFeign調(diào)用交易服務(wù)、通知服務(wù)。當(dāng)交易服務(wù)、通知服務(wù)出現(xiàn)故障時(shí),整個(gè)事務(wù)都會(huì)回滾,交易失敗。 這其實(shí)就是同步調(diào)用的級(jí)聯(lián)失敗問題。

而要解決這些問題,我們就必須用異步調(diào)用的方式來代替同步調(diào)用。

異步調(diào)用優(yōu)勢(shì)和特點(diǎn)

異步調(diào)用方式其實(shí)就是基于消息通知的方式,一般包含三個(gè)角色:

消息發(fā)送者:投遞消息的人,就是原來的調(diào)用方

消息Broker:管理、暫存、轉(zhuǎn)發(fā)消息,你可以把它理解成微信服務(wù)器

消息接收者:接收和處理消息的人,就是原來的服務(wù)提供方

在異步調(diào)用中,發(fā)送者不再直接同步調(diào)用接收者的業(yè)務(wù)接口,而是發(fā)送一條消息投遞給消息Broker。然后接收者根據(jù)自己的需求從消息Broker那里訂閱消息。每當(dāng)發(fā)送方發(fā)送消息后,接受者都能獲取消息并處理。 這樣,發(fā)送消息的人和接收消息的人就完全解耦了。

還是以余額支付業(yè)務(wù)為例:

除了扣減余額、更新支付流水單狀態(tài)以外,其它調(diào)用邏輯全部取消。而是改為發(fā)送一條消息到Broker。而相關(guān)的微服務(wù)都可以訂閱消息通知,一旦消息到達(dá)Broker,則會(huì)分發(fā)給每一個(gè)訂閱了的微服務(wù),處理各自的業(yè)務(wù)。

假如產(chǎn)品經(jīng)理提出了新的需求,比如要在支付成功后更新用戶積分。支付代碼完全不用變更,而僅僅是讓積分服務(wù)也訂閱消息即可:

不管后期增加了多少消息訂閱者,作為支付服務(wù)來講,執(zhí)行問扣減余額、更新支付流水狀態(tài)后,發(fā)送消息即可。業(yè)務(wù)耗時(shí)僅僅是這三部分業(yè)務(wù)耗時(shí),僅僅100ms,大大提高了業(yè)務(wù)性能。

另外,不管是交易服務(wù)、通知服務(wù),還是積分服務(wù),他們的業(yè)務(wù)與支付關(guān)聯(lián)度低?,F(xiàn)在采用了異步調(diào)用,解除了耦合,他們即便執(zhí)行過程中出現(xiàn)了故障,也不會(huì)影響到支付服務(wù)。

綜上,異步調(diào)用的優(yōu)勢(shì)包括:

耦合度更低

性能更好

業(yè)務(wù)拓展性強(qiáng)

故障隔離,避免級(jí)聯(lián)失敗

當(dāng)然,異步通信也并非完美無缺,它存在下列缺點(diǎn):

完全依賴于Broker的可靠性、安全性和性能

架構(gòu)復(fù)雜,后期維護(hù)和調(diào)試麻煩

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!