1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          reactive(Reactive架構的知識點有哪些)

          來源:互聯網轉載 時間:2024-05-01 09:27:01

          Reactive 和 Reactive programming

          Reactive 直接翻譯的意思式反應式,反應性。咋一看,似乎不太好懂。

          舉個例子:在 Excel 里,C 單元格上設置函數 Sum(A+B),當你改變單元格 A 或者單元格 B 的數值時,單元格 C 的值同時也會發生變化。這種行為就是 Reactive。

          在計算機編程領域,Reactive 一般指的是 Reactive programming。指的是一種面向數據流并傳播事件的異步編程范式(asynchronous programming paradigm)。

          先舉個例子大家感受一下:

          publicstaticvoidmain(String[]args){FluxProcessor<Integer,Integer>publisher=UnicastProcessor.create();publisher.doOnNext(event->System.out.println("receiveevent:"+event)).subscribe();publisher.onNext(1);//print'receiveevent:1'publisher.onNext(2);//print'receiveevent:2'}

          代碼 1

          以上例代碼(使用 Reactor 類庫)為例,publisher 產生了數據流 (1,2),并且傳播給了 OnNext 事件, 上例中 lambda 響應了該事件,輸出了相應的信息。上例代碼中生成數據流和注冊/執行 lambda 是在同一線程中,但也可以在不同線程中。

          注:如果上述代碼執行邏輯有些疑惑,可以暫時將 lambda 理解成 callback 就可以了。

          Reactive Manifesto

          對于 Reactive 現在你應該大致有一點感覺了,但是 Reactive 有什么價值,有哪些設計原則,估計你還是有些模糊。這就是 Reactive Manifesto 要解決的疑問了。

          使用 Reactive 方式構建的系統具有以下特征:

          即時響應性 (Responsive)

          只要有可能, 系統就會及時地做出響應。即時響應是可用性和實用性的基石, 而更加重要的是,即時響應意味著可以快速地檢測到問題并且有效地對其進行處理。即時響應的系統專注于提供快速而一致的響應時間, 確立可靠的反饋上限, 以提供一致的服務質量。這種一致的行為轉而將簡化錯誤處理、 建立最終用戶的信任并促使用戶與系統作進一步的互動。

          回彈性 (Resilient)

          系統在出現失敗時依然保持即時響應性。這不僅適用于高可用的、 任務關鍵型系統——任何不具備回彈性的系統都將會在發生失敗之后丟失即時響應性?;貜椥允峭ㄟ^復制、 遏制、 隔離以及委托來實現的。失敗的擴散被遏制在了每個組件內部, 與其他組件相互隔離, 從而確保系統某部分的失敗不會危及整個系統,并能獨立恢復。每個組件的恢復都被委托給了另一個(外部的)組件, 此外,在必要時可以通過復制來保證高可用性。(因此)組件的客戶端不再承擔組件失敗的處理。

          彈性 (Elastic)

          系統在不斷變化的工作負載之下依然保持即時響應性。反應式系統可以對輸入(負載)的速率變化做出反應,比如通過增加或者減少被分配用于服務這些輸入(負載)的資源。這意味著設計上并沒有爭用點和中央瓶頸, 得以進行組件的分片或者復制, 并在它們之間分布輸入(負載)。通過提供相關的實時性能指標, 反應式系統能支持預測式以及反應式的伸縮算法。這些系統可以在常規的硬件以及軟件平臺上實現成本高效的彈性。

          消息驅動 (Message Driven)

          反應式系統依賴異步的消息傳遞,從而確保了松耦合、隔離、位置透明的組件之間有著明確邊界。這一邊界還提供了將失敗作為消息委托出去的手段。使用顯式的消息傳遞,可以通過在系統中塑造并監視消息流隊列, 并在必要時應用回壓, 從而實現負載管理、 彈性以及流量控制。使用位置透明的消息傳遞作為通信的手段, 使得跨集群或者在單個主機中使用相同的結構成分和語義來管理失敗成為了可能。非阻塞的通信使得接收者可以只在活動時才消耗資源, 從而減少系統開銷。

          注:

          • 上面描述有很多專有名詞,可能有些疑惑,可以看下相關名詞解釋。

          • 為什么使用 Reactive 方式構建的系統會具有以上價值, 我稍后在 Reactor 章節中介紹。

          Reactive Stream

          知道了 Reactive 的概念,特征和價值后,是否有相關的產品或者框架來幫助我們構建 Reactive 式系統呢?在早些時候有一些類庫 (Rxjava 1.x, Rx.Net) 可以使用,但是規范并不統一,所以后來 Netfilx, Pivotal 等公司就制定了一套規范指導大家便于實現它(該規范也是受到早期產品的啟發),這就是 Reactive Stream 的作用。

          Reactive Stream 是一個使用非阻塞 back pressure(回壓)實現異步流式數據處理的標準。目前已經在 JVM 和 JavaScript 語言中實現同一套語意的規范;以及嘗試在各種涉及到序列化和反序列化的傳輸協議(TCP, UDP, HTTP and WebSockets)基礎上,定義傳輸 reactive 數據流的網絡協議。

          The purpose of Reactive Streams is to provide a standard for asynchronous stream processing with non-blocking backpressure.

          Reactive Streams 解決的問題場景

          當遇到未預料數據流時,依然可以在可控資源消耗下保持系統的可用性。

          Reactive Streams 的目標

          控制在一個異步邊界的流式數據交換。例如傳遞一個數據到另外一個線程或者線程池,確保接收方沒有 buffer(緩存)任意數量的數據。而 back pressure(回壓)是解決這種場景的不可或缺的特性。

          Reactive Streams 規范適用范圍

          此標準只描述通過回壓來實現異步流式數據交換的必要的行為和實體,最小接口,例如下方的 Publisher, Subscriber。Reactive Streams 只關注在這些組件之間的流式數據中轉,并不關注流式數據本身的組裝,分割,轉換等行為, 例如 map, zip 等 operator。Reactive Streams 規范包括:

          Publisher

          產生一個數據流(可能包含無限數據), Subscriber 們可以根據它們的需要消費這些數據。

          publicinterfacePublisher<T>{publicvoidsubscribe(Subscriber<?superT>s);}

          Subscriber

          Publisher 創建的元素的接收者。監聽指定的事件,例如 OnNext, OnComplete, onerror 等。

          publicinterfaceSubscriber<T>{publicvoidonSubscribe(Subscriptions);publicvoidonNext(Tt);publicvoidonError(Throwablet);publicvoidonComplete();}

          Subscription

          是 Publisher 和 Subscriber 一對一的協調對象。Subscriber 可以通過它來向 Publisher 取消數據發送或者 request 更多數據。

          publicinterfaceSubscription{publicvoidrequest(longn);publicvoidcancel();}

          Processor

          同時具備 Publisher 和 Subscriber 特征。代碼1中 FluxProcessor 既可以發送數據(OnNext),也可以接收數據 (doOnNext)。

          publicinterfaceProcessor<T,R>extendsSubscriber<T>,Publisher<R>{}

          為什么規范強調使用非阻塞異步方式而不是阻塞同步方式?

          • 同步方式一般通過多線程來提高性能,但系統可創建的線程數是有限的,且線程多以后造成線程切換開銷。

          • 同步方式很難進一步提升資源利用率。

          • 同步調用依賴的系統出現問題時,自身穩定性也會受到影響。

          實現非阻塞的方式有很多種,為什么規范會選擇上述的實現方式呢?

          Thread

          • thread 不是非常輕量(相比下面幾種實現方案)。

          • thread 數量是有限的,最終可能會成為主要瓶頸。

          • 有一些平臺可能不支持多線程。例如:JavaScript。

          • 調試,實現上有一定復雜性。

          Callback

          • 多層嵌套 callback 比較復雜,容易形成"圣誕樹" (callback hell)。

          • 錯誤處理比較復雜。

          • 多用于 event loop 架構的語言中,例如:JavaScript。

          Future

          • 無法邏輯組合各種行為,支持業務場景有限。

          • 錯誤處理依然復雜。

          Reactive Extensions (Rx)

          • 和 Future 很相似。Future 可以認為返回一個獨立的元素,而 Rx 返回一個可以被訂閱的 Stream。

          • 多平臺支持同一套規范。

          • 同一套 API 同時支持異步、同步。

          • 錯誤處理方便。

          Coroutines

          • kotlin coroutine 和 goroutine 在語法層面上提供異步支持, 而且比Rx更簡潔,但無法跨多個語言平臺形成統一的規范。

          Reactive 的實現原理個人認為還是回調,kotlin 協程實現原理同樣也是回調。但實現回掉的方式不一樣。一個是通過事件傳播, 一個是通過狀態機。但 cooutine 編程的易用性明顯強于 Rx,后面有空我會專門寫篇文章介紹 kotlin coroutine 的實現原理。

          Reactor

          有了 Reactive Stream 這個規范,就會有相應實現該規范的類庫。Reactor 就是其中之一。

          Reactor 是遵守 Reactive Stream 規范構建非阻塞應用的 Java 語言 Reactive 類庫,已經在 spring 5 中集成,與他相似的類庫有 RxJava2, RxJs, JDK9 Flow 等。

          阿里內部的 Faas 系統目前使用 Reactor 來構建整個系統,包括函數應用和各種核心應用(邏輯架構)。根據我們壓測結果顯示,使用 Reactive 方式構建的系統確實會有這些特點:

          • 回彈性 (Resilient):當函數出現嚴重超時時 (rt >= 10s),函數上游的 broker, gateway 應用幾乎無任何影響。

          • 及時響應性:不管是高并發場景(資源足夠),還是正常場景,RT 表現一致。

          另外從原理上,我認為資源利用率和吞吐量也會高于非反應式的應用。

          為什么 Reactive 的架構系統有這些特點?

          阿里內部的 Faas 系統主要做了兩件事情:

          涉及到 IO 的地方幾乎全異步化。例如中間件(HSF, MetaQ 等提供異步 API)調用。

          IO 線程模型變化。使用較少(一般 CPU 核數)線程處理所有的請求。

          傳統 Java 應用 IO 線程模型

          參考 Netty 中 Reactor IO (worker thread pool) 模型,下方偽代碼(kotlin)進行了簡化。

          //非阻塞讀取客戶端請求數據(in),讀取成功后執行lambda.inChannel.read(in){workerThreadPool.execute{//阻塞處理業務邏輯(process),業務邏輯在worker線程池中執行,同步執行完后,再向客戶端返回輸出(out)valout=process(in)outChannel.write(out)}}

          Reactive 應用 IO 線程模型
          IO 線程也可以執行業務邏輯 (process),可以不需要 worker 線程池。

          //非阻塞讀取客戶端請求數據(in),讀取成功后執行lambdainChannel.read(in){//IO線程執行業務邏輯(process),然后向客戶端返回輸出(out).這要求業務處理流程必須是非阻塞的.process(in){out->outChannel.write(out){//thislambdaisexecutedwhenthewritingcompletes...}}}
          標簽:reactive-

          c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...

          2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...

          :喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...

          全面兩孩是什么意思?這意味著二胎政策子的政策已經完全自由化。無論父母雙方是什么情況,無論雙方都是獨生子女,單方面是獨生子女,還是非獨生子女,都可以生第二個孩子。單獨生第二個孩子是指只要父母一方是獨生子女,就允許生第二個孩子,雙方都是獨生子女,也允許生第二個孩子。單獨二胎實施省份有哪些?1.自2014年1月17日起,浙江省實施了單獨的二胎政策2014年1月13日浙江省通過,自公布之日(2014年1月...

          623052開頭的農行卡是哪里?僅憑銀行卡號開頭數字無法確定是哪里的農行卡,用戶可以撥打農行客服熱線,轉人工服務,提供卡號查詢開戶行詳細地址。中國農業銀行總公司坐落于建國門內大街69號,也是中國大型國有制銀行之一,在業界十分知名。623052農業銀行卡歸屬地哪里?623052是中國農業銀行的國密卡,并沒有明確的歸屬地,比起普通的借記卡和儲蓄卡,這第三代國密卡具備境外消費的能力,可以在境外進行購物消...

          養寶寶真的是對媽媽的考驗!由于寶寶身體器官和功能發育不成熟,一旦媽媽在撫養過程中疏忽大意或喂養方法錯誤,寶寶的健康就容易出現問題。比如秋冬季節,氣溫下降,空空氣干燥,寶寶奶粉上火,怎么辦?多美滋教你滅火的好方法。多美滋奶粉易吸收,不上火?!吧匣稹币话惚徽J為是炎癥。從人體代謝的角度來看,主要是情緒異常、代謝排泄障礙、細菌病毒入侵、代謝功能異常引起的。寶寶生氣時,一般表現為:牙齦多、舌苔厚、口氣重、大...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>