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…