如果想不過來,可以想1條連接的並發數、連接數
服務端同步 | 服務端異步 | |
客戶端同步 | 服務端無論同步異步,效果是一樣的 想象一下1條連接的情況下,服務端同一時刻只有1個req被客戶端發送到並處理 1條連接在處理完並寫回前,永遠不會收到第2個req tcp(netty)的調用同步化(異步阻塞)及與http協議、瀏覽器關系 客戶端同步的經典案例 線程池的取值(二)設計吞吐量【重點】 客戶端強制同步模擬壓測並發數 |
同 同步 https://www.jianshu.com/p/890525ff73cb 開發了一個純異步的redis客戶端 |
客戶端異步 | 並發數==連接數 服務端1條連接,同一時刻只有1個事務被處理, 連接處理阻塞在處理事務而不會去讀第二個req |
並發數>連接數 服務端1條連接,由於異步,可能處理多於1個的req, 甚至有可能第2個req先於第1個req處理完並寫回客戶端 |
用廁所坑位來舉例
比如有4個小房間4個坑位,門就是連接通道
起初,門口阿姨一個一個放人進去,出來一個進去一個,這就是客戶端同步,並發數最多==門(連接)數==4
過了一段時間,門口阿姨阿爾茨海默了,人沒出來就放進去了,但每個房間只有一個坑,放進去的人就站在門口等,此時同時處理事務數仍然==坑位(連接)數==4;這種搞法有個問題,總有一天門被擠爆了,對於netty而言(netty 是否要開啟業務線程池),要么tcp接收緩沖區窗口擠滿,要么接收區直接內存爆掉;對於異步投遞線程池,線程池的取值(二)設計吞吐量【重點】 / 組合設計qps【重點】 ,即是任務隊列爆掉
又過了一段時間,發現小房間里面有個小門,尼瑪還有個暗格,里面有個大房間可以隨時隨地,小房間只起一個通道的作用,大房間的人(並發)數遠大於坑位(連接)數4
netty爆掉:
因為netty的鏈路會自己讀內核,內核永遠可以接收數據,tcp內核緩沖區-netty堆外緩存-堆內-handler
1)handler處理慢的話,對外內存爆掉,如上述中間那幅圖
2)用業務線程,遲早如上述右邊圖
相關 :