讀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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...