讀Java性能權威指南(第2版)筆記30_Java伺服器

来源:https://www.cnblogs.com/lying7/archive/2023/03/28/17259831.html
-Advertisement-
Play Games

1. 響應式編程 1.1. 使用基於事件的範式處理非同步數據流 1.2. 和非同步編程提供了相同的性能優勢 1.3. 能夠擴展程式(特別是擴展I/O)以處理很多連接和數據源 2. 非阻塞I/O 2.1. 有效擴展伺服器的基礎 2.2. 允許伺服器用相對較少的線程處理相對較多的連接 2.2.1. 傳統的服 ...


1. 響應式編程

1.1. 使用基於事件的範式處理非同步數據流

1.2. 和非同步編程提供了相同的性能優勢

1.3. 能夠擴展程式(特別是擴展I/O)以處理很多連接和數據源

2. 非阻塞I/O

2.1. 有效擴展伺服器的基礎

2.2. 允許伺服器用相對較少的線程處理相對較多的連接

  • 2.2.1. 傳統的伺服器利用這一點來處理基本的客戶端連接

  • 2.2.2. 新的伺服器可以將非阻塞特性擴展到其他應用程式

3. 優化伺服器線程池

3.1. 選擇器線程

  • 3.1.1. 在I/O可用時通知系統調用的線程

3.2. 選擇器通知有客戶端I/O待處理之後,另一個包含工作線程的線程池會處理實際的請求和響應

3.3. 要足夠多的工作線程來處理伺服器所能處理的併發請求數(而非併發連接數)

3.4. 像所有受限於CPU的情況一樣,線程的數量沒有必要比運行伺服器的機器或容器的虛擬CPU數量多,因為永遠沒有辦法運行那麼多的線程

3.5. 將長請求推遲到另一個線程池中,這為主線程池提供了更強大的請求處理能力

3.6. 非同步REST伺服器

  • 3.6.1. 使用非同步響應有3個原因

    • 3.6.1.1. 為了在業務邏輯中引入更多的並行性

    • 3.6.1.2. 為了限制活躍線程的數量

    • 3.6.1.3. 為了適當地對伺服器限流

  • 3.6.2. 添加了@Suspended註解的AsyncResponse正在等待邏輯完成,一旦完成,它就會繼續將響應發回給用戶

  • 3.6.3. 在排隊等待響應之前,看看非同步線程池的狀態,如果系統太忙,就拒絕請求

  • 3.6.4. 如果線程數量等於池大小,響應會被立即取消

    • 3.6.4.1. 調用者會立即收到錯誤提示“HTTP 503服務不可用”,表示此時不能處理該請求
  • 3.6.5. 立即返回該錯誤能減少過載伺服器的負載,這最終會使整體性能大幅提高

    • 3.6.5.1. 這是REST處理過載伺服器的首選方式

4. 非同步出站調用

4.1. HTTP客戶端

  • 4.1.1. 處理髮向伺服器的HTTP請求類

  • 4.1.2. 可以通過在多個線程之間分配工作來提高性能,從而增加併發量

  • 4.1.3. java.net.HttpURLConnection類

    • 4.1.3.1. Java 8
  • 4.1.4. java.net.HttpsURLConnection

    • 4.1.4.1. Java 8
  • 4.1.5. java.net.http. HttpClient類

    • 4.1.5.1. 也處理HTTPS

    • 4.1.5.2. Java 11

  • 4.1.6. org.apache.http.client.HttpClient

    • 4.1.6.1. Apache軟體基金會
  • 4.1.7. org.asynchttpclient.AsyncHttpClient

    • 4.1.7.1. Netty項目
  • 4.1.8. org.eclipse.jetty.client.HttpClient

    • 4.1.8.1. Eclipse基金

4.2. JAX-RS

  • 4.2.1. JAX-RS連接器提供了一個Client對象用於REST調用

  • 4.2.2. HTTP客戶端可以正確地池化連接並使用keepalive來保持連接開放

4.3. -Dhttp.maxConnections=N

  • 4.3.1. 改變池的大小

  • 4.3.2. 預設值是5

  • 4.3.3. 適用於HTTPS連接

  • 4.3.4. 不能起到限流的作用

4.4. HttpClient類

  • 4.4.1. JDK 11

  • 4.4.2. 預設的池大小是無限制的

  • 4.4.3. -Djdk.httpclient.connectionPoolSize=N

    • 4.4.3.1. 不能起到限流的作用

    • 4.4.3.2. 請求的連接超過了配置的數量,它們會在需要的時候被創建,在完成任務後被銷毀

4.5. 與使用傳統I/O構建的客戶端相比,使用NIO構建的非同步HTTP客戶端需要的線程更少

4.6. 但REST伺服器仍然需要相當多的線程來處理非同步請求

5. 非同步資料庫調用

5.1. 使用最廣泛的是Spring項目的Spring Data R2DBC

  • 5.1.1. 對於關係資料庫的非阻塞訪問來說,這是最好的選擇

5.2. 針對響應式NoSQL資料庫的Spring項目可以用於真正的非同步訪問

6. 格式

6.1. Apache Avro

6.2. Google的Protocol Buffers

6.3. XML

6.4. JSON

7. JSON處理

7.1. 解碼(unmarshaling)

  • 7.1.1. 輸出的是一個Java對象

7.2. 解析(parsing)

  • 7.2.1. 數據在讀取時被處理,這個過程就叫作解析

7.3. 給定一系列JSON字元串,程式必須將這些字元串轉換為適合Java處理的數據

7.4. 編碼(marshaling)

  • 7.4.1. 從其他數據生成JSON字元串的過程

7.5. 通用技術

  • 7.5.1. 拉解析器(pull parser)

    • 7.5.1.1. 輸入的數據與解析器相關聯,程式從解析器請求(或拉取)一系列標記(token)
  • 7.5.2. 文檔模型(document model)

    • 7.5.2.1. 輸入的數據被轉換為一個文檔風格的對象,應用程式可以在尋找數據片段時遍歷這個對象
  • 7.5.3. 對象表示(object representation)

    • 7.5.3.1. 通過使用一組反映數據結構的預定義類,將輸入的數據轉換成一個或多個Java對象

    • 7.5.3.2. POJO(plain old Java object)

7.6. JSON數據表示形式

  • 7.6.1. 簡單JSON對象

    • 7.6.1.1. 通用介面進行操作,如JsonObject和JsonArray

    • 7.6.1.2. 不需要具體表示數據的類

    • 7.6.1.3. 生成簡單JSON對象比生成自定義Java類要快得多

  • 7.6.2. JSON對象表示形式

    • 7.6.2.1. 從編程的角度來看,這些Java類更容易使用

    • 7.6.2.2. 使用可以產生POJO的JSON-B(JSON Binding),將JSON數據綁定到一個完整的Java類

7.7. Jackson

  • 7.7.1. Jackson解析器通常是最快的解析器,應該優先選擇它,而不是選擇預設的實現

7.8. 所有的JSON解析器都是拉解析器

  • 7.8.1. 從流中按需檢索數據

  • 7.8.2. 實際的解析器不能被重覆使用,它們也不是線程安全的。因此,解析器通常是按需創建的

7.9. 處理JSON有兩種方式:創建POJO對象和直接解析

  • 7.9.1. 直接解析提供了過濾的能力和通用的性能提升機會

  • 7.9.2. 當對象很大時,創建JSON對象往往會導致GC問題


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JSS 是什麼 簡單來說,一句話概括CSS in JS (JSS),就是"行內樣式"(inline style)和"行內腳本"(inline script)。 因為,自從React出現以後,基於組件化的要求,強制把HTML、CSS、JavaScript捆綁在一起,在同一個文件裡面,封裝了結構、樣式、 ...
  • 現代瀏覽器用FileReader,老版本IE載入adodb.stream用ISO-8859-1~15字元集處理讀取,要註意與Unicode的編碼衝突。new bing會失憶會裝傻。 ...
  • el-radio el-radio中,已經選中的按鈕無法通過再次點擊去取消選擇,所以要滿足條件需要改變成對應的點擊事件。 <template> <div id="app"> <el-radio v-model="radio" :label="true" @click.native.prevent=" ...
  • 插槽基本介紹 在開發中,我們會經常封裝一個個可復用的組件: 前面我們會通過props傳遞給組件一些數據,讓組件來進行展示; 但是為了讓這個組件具備更強的通用性,我們不能將組件中的內容限製為固定的div、span等等這些元素; 比如某種情況下我們使用組件,希望組件顯示的是一個按鈕,某種情況下我們使用組 ...
  • 定義 定義一系列的演算法,將他們一個個封裝起來,使他們直接可以相互替換。 演算法:就是寫的邏輯可以是你任何一個功能函數的邏輯 封裝:就是把某一功能點對應的邏輯給抽出來 可替換:建立在封裝的基礎上,這些獨立的演算法可以很方便的替換 通俗的理解就是,把你的演算法(邏輯)封裝到不同的策略中,在不同的策略中是互相獨 ...
  • 訪問者模式(Visitor Pattern)是一種行為型設計模式,用於將操作與其所操作的對象分離開來。該模式的核心思想是將操作封裝在一個訪問者對象中,而不是分散在各個對象中。通過將操作與對象分離開來,訪問者模式可以在不修改對象結構的情況下,添加新的操作。 在前端開發中,訪問者模式通常用於處理DOM樹 ...
  • mounted: () { this.getList('', (data) => { console.log(data); }) } methods: { getList (condition) { get_list({...condition}).then(res => { if (res.dat ...
  • 在Vue $mount過程中,我們需要把模版編譯成render函數,整體實現可以分為三部分: parse、optimize、codegen。 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 插件化的需求主要源於對軟體架構靈活性的追求,特別是在開發大型、複雜或需要不斷更新的軟體系統時,插件化可以提高軟體系統的可擴展性、可定製性、隔離性、安全性、可維護性、模塊化、易於升級和更新以及支持第三方開發等方面的能力,從而滿足不斷變化的業務需求和技術挑戰。 一、插件化探索 在WPF中我們想要開 ...
  • 歡迎ReaLTaiizor是一個用戶友好的、以設計為中心的.NET WinForms項目控制項庫,包含廣泛的組件。您可以使用不同的主題選項對項目進行個性化設置,並自定義用戶控制項,以使您的應用程式更加專業。 項目地址:https://github.com/Taiizor/ReaLTaiizor 步驟1: ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • Channel 是乾什麼的 The System.Threading.Channels namespace provides a set of synchronization data structures for passing data between producers and consume ...
  • efcore如何優雅的實現按年分庫按月分表 介紹 本文ShardinfCore版本 本期主角: ShardingCore 一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案,具有零依賴、零學習成本、零業務代碼入侵適配 距離上次發文.net相關的已經有很久了,期間一直在從事java相關的 ...
  • 前言 Spacesniffer 是一個免費的文件掃描工具,通過使用樹狀圖可視化佈局,可以立即瞭解大文件夾的位置,幫助用戶處理找到這些文件夾 當前系統C盤空間 清理後系統C盤空間 下載 Spacesniffer 下載地址:https://spacesniffer.en.softonic.com/dow ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • 一、ReZero簡介 ReZero是一款.NET中間件 : 全網唯一開源界面操作就能生成API , 可以集成到任何.NET6+ API項目,無破壞性,也可讓非.NET用戶使用exe文件 免費開源:MIT最寬鬆協議 , 一直從事開源事業十年,一直堅持開源 1.1 純ReZero開發 適合.Net Co ...
  • 一:背景 1. 講故事 停了一個月沒有更新文章了,主要是忙於寫 C#內功修煉系列的PPT,現在基本上接近尾聲,可以回頭繼續更新這段時間分析dump的一些事故報告,有朋友微信上找到我,說他們的系統出現了大量的http超時,程式不響應處理了,讓我幫忙看下怎麼回事,dump也抓到了。 二:WinDbg分析 ...
  • 開始做項目管理了(本人3年java,來到這邊之後真沒想到...),天天開會溝通整理需求,他們講話的時候忙裡偷閑整理一下常用的方法,其實語言還是有共通性的,基本上看到方法名就大概能猜出來用法。出去打水的時候看到外面太陽好好,真想在外面坐著曬太陽,回來的時候好兄弟三年前送給我的鍵盤D鍵不靈了,在打"等待 ...