响应式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…
總結
以上是生活随笔為你收集整理的响应式web(一):什么是响应式web,异步调用,callback的本质,servlet3的异步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM从入门到精通(十):垃圾回收算法串
- 下一篇: ZooKeeper实战(三):ZooKe