? ? 回調(diào),在平時(shí)工作中經(jīng)常能夠聽(tīng)到玫膀。字面意思就是矛缨,我調(diào)用某對(duì)象的某項(xiàng)服務(wù),然后等到將來(lái)的某個(gè)時(shí)機(jī)帖旨,被調(diào)用對(duì)象返回我想要的數(shù)據(jù)箕昭。其實(shí),從字面上這樣理解就可以大致知道什么意思了解阅,但是這里的我調(diào)用對(duì)象的某項(xiàng)服務(wù)換成我向某個(gè)對(duì)象注冊(cè)一個(gè)感興趣的事件更為合適落竹。
? ?在java里面有很多例子,最典型的就是PubSub模型货抄,也就是設(shè)計(jì)模式中的觀察者模式述召,首先很多客戶向Publisher訂閱消息,也就是把自己的reference給Publisher蟹地,然后Publisher觸發(fā)事件后遍歷一個(gè)集合积暖,然后調(diào)用對(duì)應(yīng)的方法,這樣只要向Publisher注冊(cè)的對(duì)象都會(huì)收到消息怪与。從上面我們可以看出回調(diào)是事件觸發(fā)的夺刑,事件觸發(fā)一般意味著異步。
? ?那么回調(diào)到底解決了什么問(wèn)題呢分别?
比如說(shuō)我們想知道有沒(méi)有人去點(diǎn)某個(gè)按鈕遍愿,如果不異步通信,那么就只能沒(méi)隔一段時(shí)間去問(wèn)一下茎杂,這種輪詢其實(shí)并沒(méi)有做什么有意義的事情错览,卻占用著cpu資源。如果煌往,異步的話倾哺,我只要向那個(gè)按鈕注冊(cè)一個(gè)點(diǎn)擊事件轧邪,然后告訴我這個(gè)回調(diào)函數(shù),那么我就可以做其他事情了羞海,這樣效率也就提高了忌愚。
但是異步比起同步就難多了,因?yàn)槿绻惒降娜プ鋈吹耍话愣际嵌嗑€程編程硕糊,多線程編程中安全性和數(shù)據(jù)的一致性是一個(gè)值得關(guān)注的點(diǎn),還有一點(diǎn)就是腊徙,我雖然注冊(cè)了某項(xiàng)服務(wù)简十,但是我并不知道什么時(shí)候他給我,所以這就要進(jìn)行合理的設(shè)計(jì)撬腾,比如說(shuō)螟蝙,我注冊(cè)了某個(gè)服務(wù)后,不是立即去用回調(diào)返回的數(shù)據(jù)民傻,而是先去處理其他的一些業(yè)務(wù)邏輯胰默,然后再處理這個(gè)回調(diào)數(shù)據(jù),這樣異步的作用就體現(xiàn)出來(lái)了漓踢,也不會(huì)阻塞牵署,如果我注冊(cè)之后立即調(diào)用那么會(huì)出現(xiàn)被調(diào)用方?jīng)]有準(zhǔn)備好,因此我這邊會(huì)阻塞喧半,不阻塞沒(méi)有辦法奴迅,因?yàn)橄胍臄?shù)據(jù)沒(méi)有,雖然一些編程語(yǔ)言也提供設(shè)置等待超時(shí)時(shí)間薯酝,但是這樣就違背設(shè)計(jì)的初衷了半沽,如果不合適就別這樣設(shè)計(jì)。
? ?在之前的公司吴菠,我用到過(guò)一個(gè)分布式消息隊(duì)列,rabbitmq,解決的問(wèn)題是分布式的PubSub的問(wèn)題浩村,而且功能很多礼烈,可以支持消息的持久化腮恩。解決了分布式通信的問(wèn)題,可靠性,吞吐量都還可以常柄。其實(shí)把隊(duì)列設(shè)置成持久化之后,吞吐量大概會(huì)下降10被荠锭,畢竟需要io操作把消息持久化堤魁,等到subscriber收到消息后,給rabbitmq發(fā)送一個(gè)ack铐姚,mq才把持久化的消息給刪除策肝。
? ? 之前用akka肛捍,一個(gè)akka系統(tǒng)由許多個(gè)actor組成,actor是最小單元而且actor之間的通信都是異步的之众。actor之間的通信又兩種拙毫,一種是one to one,這種one to one和面向?qū)ο笾械囊粋€(gè)對(duì)象調(diào)用另一個(gè)對(duì)象不同棺禾,面向?qū)ο缶幊趟枷胫凶禾悖瑢?duì)象的調(diào)用一般都是同步的,除非來(lái)一個(gè)新的線程異步的去做膘婶。另一種是one to many 缺前,actor system中有個(gè)總線,類似于計(jì)算機(jī)中的總線悬襟,每次我發(fā)送消息的時(shí)候衅码,我會(huì)向總線中publish這個(gè)message,然后其他actor可以先向總線中注冊(cè)以及感興趣的消息古胆,因?yàn)槿绻簧婕暗郊旱脑捤衋ctor都是在一個(gè)系統(tǒng)中的肆良,所以是可行的∫菀铮可以看出one to many也是PubSub模型惹恃。也是異步通信或者分布式通信的主要方法。