乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      5 分鐘理解什么是“響應(yīng)式編程(Reactive Programming)”

       liang1234_ 2019-05-04

      背景

      許多人都聽(tīng)過(guò)異步編程,同步編程,但是好像對(duì)響應(yīng)式編程這個(gè)新名稱(chēng)感到很陌生,即使我們?cè)趯?shí)際項(xiàng)目中已經(jīng)在使用這種編程方式。

      這篇文章就是來(lái)介紹響應(yīng)式編程(Reactive Progamming)到底是怎么回事。

      如果我們?cè)?Google 中輸入 Reactive Programming,試圖了解這到底是怎樣的一種編程模式,我們很快會(huì)發(fā)現(xiàn)大量的文章,但是看完我們就會(huì)迷糊,概念還是不是那么清晰。這可能是因?yàn)樵S多介紹文章對(duì)領(lǐng)域的強(qiáng)關(guān)聯(lián)導(dǎo)致的。比如最常見(jiàn)的一種介紹是用一種數(shù)據(jù)流(data stream)的方式來(lái)展現(xiàn),還有就是前端領(lǐng)域的控件事件流,雖然這些場(chǎng)景是響應(yīng)式編程適合的,但是對(duì)我來(lái)說(shuō),總覺(jué)得還是不夠直觀。因?yàn)槲颐鎸?duì)的是分布式系統(tǒng)的編程場(chǎng)景。

      其實(shí)響應(yīng)式編程沒(méi)必要跟具體的應(yīng)用領(lǐng)域關(guān)聯(lián),它是一個(gè)可以普遍適用的概念和編程模型。

      同步與異步

      分布式網(wǎng)絡(luò)系統(tǒng)中,各個(gè)參與方節(jié)點(diǎn)的運(yùn)行是相互獨(dú)立的,沒(méi)有共享內(nèi)存,沒(méi)有全局時(shí)鐘。各節(jié)點(diǎn)通過(guò)消息來(lái)進(jìn)行溝通。在傳統(tǒng)的理念中,我們會(huì)把這樣的網(wǎng)絡(luò)根據(jù)他們通信方式描述成同步和異步的。簡(jiǎn)單來(lái)說(shuō),同步網(wǎng)絡(luò)是對(duì)消息的到達(dá)時(shí)間有限定要求(time bounded),以便保證網(wǎng)絡(luò)活動(dòng)的確定性。而異步的網(wǎng)絡(luò),則對(duì)消息的到達(dá)沒(méi)有任何限制。即使發(fā)出的消息丟失了,也不會(huì)損害網(wǎng)絡(luò)的活性。用一個(gè)具體的例子來(lái)理解就是,節(jié)點(diǎn) A 發(fā)送了一個(gè)消息給節(jié)點(diǎn) B,期待得到 B 的回復(fù),以便通過(guò)某個(gè)決議或者完成某件后續(xù)事情,這個(gè)依賴等待的要求,就是同步網(wǎng)絡(luò)。因?yàn)樗蕾囈粋€(gè)答復(fù)才能進(jìn)行后續(xù)動(dòng)作。換句話說(shuō),如果一個(gè)節(jié)點(diǎn)發(fā)送消息之后,不依賴另一個(gè)節(jié)點(diǎn)的答復(fù)也能正常運(yùn)行,那么就是異步網(wǎng)絡(luò)。

      在同步網(wǎng)絡(luò)中,如果 B 由于網(wǎng)絡(luò)原因(掉線,或者CPU繁忙,等等)沒(méi)有在限定時(shí)間內(nèi)回復(fù),A 既不能確定消息已經(jīng)發(fā)送給 B,也無(wú)法確定后續(xù)步驟什么時(shí)候才能開(kāi)始,因此,網(wǎng)絡(luò)活動(dòng)變得不可預(yù)測(cè),無(wú)法結(jié)束,也就是沒(méi)有了確定性。業(yè)界已經(jīng)證明了,在實(shí)際的網(wǎng)絡(luò)中,如果不對(duì)網(wǎng)絡(luò)條件施加任何限制,那么網(wǎng)絡(luò)確定性是永遠(yuǎn)無(wú)法達(dá)到的。因此,為了保證網(wǎng)絡(luò)活動(dòng)的確定性,我們通常會(huì)網(wǎng)絡(luò)條件施加一些限制,比如,最典型的就是消息到達(dá)的時(shí)間限制。

      解釋了同步網(wǎng)絡(luò)和異步網(wǎng)絡(luò)的區(qū)別,我們?cè)賮?lái)看同步編程和異步編程,其實(shí)我們接觸這兩個(gè)編程模式很久了。同步編程簡(jiǎn)單來(lái)說(shuō)就是,發(fā)出一個(gè)任務(wù),然后等待執(zhí)行。而異步編程就是,發(fā)出一個(gè)任務(wù),不等待結(jié)果,就繼續(xù)發(fā)出下一個(gè)任務(wù)。至于上一個(gè)任務(wù)的執(zhí)行結(jié)果,我們可以通過(guò)兩種方式獲得,一個(gè)是主動(dòng)的輪訓(xùn),另一個(gè)是被動(dòng)的接收反饋。由于在異步編程中,我們從不等待執(zhí)行結(jié)果,就可以進(jìn)行其他任務(wù)(前提是這個(gè)任務(wù)本身不依賴上一個(gè)任務(wù)的結(jié)果)。如果要執(zhí)行的某個(gè)其他任務(wù)依賴于上一個(gè)任務(wù)的結(jié)果,那么我們可以每隔一段時(shí)間輪訓(xùn)一次,或者另外開(kāi)一個(gè)線程去等待接收任務(wù)結(jié)果。無(wú)論哪種情況,我們的網(wǎng)絡(luò)都不會(huì)阻塞在某一個(gè)單獨(dú)的任務(wù)上。

      響應(yīng)式編程

      現(xiàn)在,我們很自然的過(guò)渡到響應(yīng)式編程(Reactive Programming)這個(gè)概念上,它是一種基于事件模式的模型。在上面的異步編程模式中,我們描述了兩種獲得上一個(gè)任務(wù)執(zhí)行結(jié)果的方式,一個(gè)就是主動(dòng)輪訓(xùn),我們把它稱(chēng)為 Proactive 方式。另一個(gè)就是被動(dòng)接收反饋,我們稱(chēng)為 Reactive。

      簡(jiǎn)單來(lái)說(shuō),在 Reactive 方式中,上一個(gè)任務(wù)執(zhí)行結(jié)果的反饋就是一個(gè)事件,這個(gè)事件的到來(lái)將會(huì)觸發(fā)下一個(gè)任務(wù)的執(zhí)行。

      這也就是 Reactive 的內(nèi)涵!我們把處理和發(fā)出事件的主體稱(chēng)為 Reactor,它可以接受事件并處理,也可以在處理完事件后,發(fā)出下一個(gè)事件給其他 Reactor。兩個(gè) Reactors 之間沒(méi)有必然的強(qiáng)耦合,他們之間通過(guò)消息管道來(lái)傳遞消息。Reactor 可以定義一些事件處理函數(shù),根據(jù)接收到的事件不同類(lèi)型來(lái)進(jìn)行不同的處理。如果我們的系統(tǒng)復(fù)雜,我們還可以專(zhuān)門(mén)定義不同功能類(lèi)別的 Reactors,分別處理不同類(lèi)型的事件。而在每個(gè) Reactor 中對(duì)事件又進(jìn)行細(xì)分處理。

      需要強(qiáng)調(diào)的是,實(shí)現(xiàn) Reactive 模型最核心的是線程消息管道。線程用于偵聽(tīng)事件,消息管道用于 Reactor 之間通信不同的消息。與他們相關(guān)的是事件管理器用于注冊(cè)、注銷(xiāo)事件,而消息分配器則會(huì)根據(jù)消息類(lèi)型分發(fā)。

      下面是一個(gè) Reactive 模型的示意圖:

      術(shù)語(yǔ)理解

      在了解了上述異步編程模型的本質(zhì)之后,我們?cè)賮?lái)看一些我們常見(jiàn)的術(shù)語(yǔ),就會(huì)發(fā)現(xiàn)一切都變得清晰明了了。

      比如,依賴鏈(Dependency chain),假定我們有一個(gè)事件依賴鏈?zhǔn)沁@樣:睡覺(jué) -> 吃飯 -> 餓了,很直覺(jué)的是,在這個(gè)依賴鏈中,只有滿足了后面的條件,前面的才會(huì)執(zhí)行。

      這種依賴鏈?zhǔn)沁@個(gè)世界普遍的一種場(chǎng)景,一種正向的處理模式是,每隔一段時(shí)間就輪訓(xùn)檢測(cè)是否滿足睡覺(jué)的條件,在檢查是否能睡覺(jué)的時(shí)候,會(huì)先檢查是否已經(jīng)吃飯,檢查是否已經(jīng)吃飯的時(shí)候,又會(huì)先檢查是否餓了。那么這就是 Proactive 模式!而 Reactive 模式則反過(guò)來(lái),先有事件的觸發(fā),然后事件來(lái)到響應(yīng)方,響應(yīng)方進(jìn)行處理,這種方式也叫 Pub/Sub 模式。我們?cè)?OOP 語(yǔ)言中,也會(huì)用到同樣的概念和邏輯,我們把之叫做 Observer 模式,而在 Funcaitonal Programming 中,也有同樣的概念,它可以用 monads 來(lái)實(shí)現(xiàn)。

      比如,我們有一個(gè) Publisher ,會(huì)產(chǎn)生 “餓” 事件,同時(shí)還有一個(gè)或多個(gè) Subscriber,在收到 “餓” 事件的發(fā)生之后,進(jìn)行響應(yīng)(比如更新?tīng)顟B(tài)或者作出其他預(yù)先注冊(cè)好的行為)。

      總的來(lái)說(shuō),Reactive Programming 就是編寫(xiě)關(guān)于怎么響應(yīng)事件的編程模式,這些事件包括:用戶輸入,數(shù)據(jù)流,系統(tǒng)狀態(tài)的變化等等。

      總結(jié)一下,響應(yīng)式編程通常會(huì)用在一個(gè)事件流相關(guān)的場(chǎng)景中,在一個(gè)事件流中,一旦觸發(fā)第一個(gè)事件,后續(xù)的事件會(huì)被依次觸發(fā),就像一個(gè) Pipeline 系統(tǒng),不斷有輸入和輸出。

      響應(yīng)式編程的設(shè)計(jì)與實(shí)現(xiàn)

      接下來(lái),講一下實(shí)現(xiàn)上的架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)。

      通常 Reactor 的數(shù)量可以是預(yù)先定義的,因?yàn)橐粋€(gè)系統(tǒng),我們通??梢约s束它處理哪些預(yù)定義的事件,比如有處理網(wǎng)絡(luò)連接的 Reactor,處理日志收集的 Reactor,處理數(shù)據(jù)存儲(chǔ)的 Reactor 等等,各司其職。而錯(cuò)誤(未定義)事件則可以單獨(dú)放在一個(gè)專(zhuān)門(mén)處理 Error/Exception 的 Reactor 中。通過(guò)事件管理器,每個(gè) Reactor 可以根據(jù)要發(fā)出或者接收的消息,即時(shí)地創(chuàng)建一個(gè)線程/協(xié)程去執(zhí)行響應(yīng)的操作。發(fā)出和接收消息可以根據(jù)業(yè)務(wù)的復(fù)雜度,分開(kāi)單獨(dú)線程,也可以放在一個(gè)線程。這樣的設(shè)計(jì)架構(gòu)簡(jiǎn)單而清晰。

      下面是一個(gè)簡(jiǎn)單的示意圖:


        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類(lèi)似文章 更多