響應式web(一):什麼是響應式web,異步調用,callback的本質,servlet3的異步

Reactive

在這裏插入圖片描述

同步與異步

傳統的web模型 “命令式編程”:阻塞式模型,一個請求發過來,也許你會開啓新的線程,但最後需要等待完成所有操作之後,才能返回response。

一個一個的操作組成了整個業務線,操作之間有先後順序。所有具有先後順序的操作,都在同一個線程內。
在這裏插入圖片描述

微服務:開啓一個新的線程A去請求別的服務,A線程要等待業務結果返回之後,才能繼續執行下面的業務邏輯。這是阻塞的。
在這裏插入圖片描述

Tomcat的NIO異步網絡

網絡連接的線程池,作用是和客戶端建立連接:BIO,NIO;你也可以用多路複用器
但是到了Tomcat之後,業務線程要阻塞地等待業務處理結果,才能返回。
固定線程:連接線程與業務線程1:1的比例,這樣的模式的缺陷是
每開啓一個線程,需要1024KB的棧內存開銷;(64位 jdk8下)
500個併發請求,在JVM至少需要佔用500M內存,這還是沒幹活的情況下。如果棧內存滿了,會stack over flow,整個JVM的棧就掛了。
當線程個數越多,系統響應的時間會越長。

如何具有彈性?用線程池。

輪詢/長輪詢
長連接是客戶端和服務端同時設置才生效,長輪詢是服務端編程處理手動掛起請求,與客戶端無關。

長輪詢:http可以保持90s,90s還沒有返回的話,需要續租。這樣就用http協議僞造了一個假的長連接。
這就是響應式的web。響應的是誰?響應的是客戶端。
keep-alived:複用的TCP的連接通道,http複用了tcp連接。http是無狀態的,並不是複用的http連接。
在這裏插入圖片描述
長輪詢
在這裏插入圖片描述SSE:Server sent event,服務器發送事件。服務器給我推消息,我就沒法給服務器推消息了。

傳統的sevlet api,SSE:
在這裏插入圖片描述
在這裏插入圖片描述
拋一個線程,實際上並不是異步,因爲還要等後面的線程返回數據,才能繼續
在這裏插入圖片描述

觀察者模式

你要有一個Observer對象,有一個Subject對象。Observer作爲觀察者,觀察有沒有新的事件發生。
要有一個觀察者裏面存了List,集合裏面存放事件。

A是一個線程組,B也是一個線程組。A想要喫飯,告訴觀察者。觀察者讓B做飯。B做完飯返回,A再去觀察者那裏拿。
每一個線程都在做自己該做的事,解耦。線程之間通過觀察者通信。
在這裏插入圖片描述
兩個線程組的連接數量是不對等的。
在這裏插入圖片描述
線程池是獨立的,相互之間不影響,這樣就不會因爲某個業務阻塞。
在這裏插入圖片描述
懂了這個原理,然後我們就可以開始引入響應式的框架webflux了。

命令式編程與響應式

在這裏插入圖片描述
服務器推技術,Servlet3.0與3.1…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章