主頁 > 軟體設計 > 讀發布!設計與部署穩定的分布式系統(第2版)筆記11_無限長的結果集

讀發布!設計與部署穩定的分布式系統(第2版)筆記11_無限長的結果集

2023-06-25 08:13:00 軟體設計

1. 無限長的結果集是導致回應緩慢的常見原因

1.1. 當違反穩態模式時,就可能產生無限長的結果集

1.2. 當呼叫方允許另一個系統支配呼叫時,就會出現一個無限長的結果集

2. 資料庫突然回傳500萬行,而不是通常的100多行時會發生什么?

2.1. 在用戶失去興趣后的很長時間內,還在一個while回圈中打轉

2.2. 除非應用程式明確限制了其可以處理的結果數量,否則系統就可能會耗盡記憶體

3. 早期的社交媒體網站假定每個用戶的連接數量將會呈現鐘形曲線一樣的分布,但事實上是一個冪律分布

3.1. 如果使用鐘形曲線分布式關系進行測驗,則永遠不會期望能加載一個其關系數量比平均值多幾百萬倍的物體

3.2. 但是當使用冪律分布時,肯定會出現這種情況

4. 某表從不會超過1000行,但DBA發現,它位于最大系統開銷查詢串列之首

4.1. 高CPU使用率看起來像是垃圾回收造成的

4.2. 這個通常很小的表,當時竟然擁有超過1000萬行的記錄

4.2.1. 由于在開發程序中的資料集往往很小,因此應用程式開發工程師可能永遠不會體驗到這樣的負面后果

4.3. 避免這臺應用程式服務器查詢中缺少LIMIT子句所造成的災難

4.4. sql

-- Microsoft SQL Server

SELECT TOP 15 colspec FROM tablespec
-- Oracle(since 8i)
SELECT colspec FROM tablespec
WHERE rownum <= 15
-- MySQL and PostgreSQL
SELECT colspec FROM tablespec
LIMIT 15

5. 解決方案

5.1. 在所有API或協議中,呼叫方應該始終指出準備接受的回應數目

5.2. 注意所有可能會累積無限子記錄的資料庫關系

5.2.1. 標準的SQL語法限定結果集的大小

5.3. 可以先對完整的結果集進行查詢,但在達到最大行數后,就跳出處理回圈

5.3.1. 給應用程式服務器提供一些額外的穩定性,但代價是浪費了資料庫的系統容量

5.4. 使用切合實際的資料量

5.5. 在前端發送分頁請求

5.6. 不要依賴資料生產者

5.6.1. 由于系統某個其他部分的作用,這個數量可能會在沒有警告的情況下發生變化

5.6.2. 合理的數量只能是“零”“一”和“許多”

5.6.3. 除非單單查詢某一行,否則就有可能回傳太多結果

5.6.4. 要想對創建的資料量加以限制,不要依賴資料生產者

5.7. 在其他應用程式級別的協議中使用回傳數量限制機制

5.7.1. 服務呼叫、RMI、DCOM、XML-RPC以及任何其他型別的請求-回復呼叫,都容易回傳巨量的物件,從而消耗太多記憶體

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/555888.html

標籤:其他

上一篇:讀發布!設計與部署穩定的分布式系統(第2版)筆記10_自動化和緩慢的回應

下一篇:返回列表

標籤雲
其他(161551) Python(38244) JavaScript(25513) Java(18251) C(15238) 區塊鏈(8272) C#(7972) AI(7469) 爪哇(7425) MySQL(7265) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4606) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2437) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) HtmlCss(1971) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布