后臺系統可擴展性學習筆記(二)權衡取舍

文章目錄

  • 性能與可擴展性
  • 延遲與吞吐量
  • 可用性與一致性
  • 一致性模式
  • 可用性模式
  • 可用性衡量
  • 參考

系統設計中也面臨許多權衡取舍:

  • 性能與可擴展性
  • 延遲與吞吐量
  • 可用性與一致性

性能與可擴展性

可擴展,意味著服務能以加資源的方式成比例地提升性能,性能提升體現在能夠承擔更多的工作量,但加資源也會引入多樣性:一些節點可能比其它節點的處理能力更強大,另一些老舊節點可能弱一些,而系統又必須適應這種異質性(heterogeneity),那么依賴均勻性的算法就會對新節點利用不足,繼而產生性能影響

延遲與吞吐量

延遲(Latency)是指從執行操作到產生結果所需要的時間,其度量單位是時間。
吞吐量(Throughput)是指單位時間內所能處理的操作數,或能產生的結果數。
通過單位時間所生產的東西來計量,例如內存帶寬(memory bandwidth)用來衡量內存系統的吞吐量,而對于Web系統,有這些度量單位:

QPS(Queries Per Second):用來衡量信息檢索系統(如搜索引擎、數據庫等)在1秒內的搜索流量RPS(Requests Per Second):請求-響應系統(如Web服務器)每秒所能處理的最大請求數量TPS(Transactions Per Second):廣義上指在1秒內所能執行的原子操作數量,狹義上指DBMS在1秒所能執行的transaction數量

通常也用QPS衡量Web服務的吞吐量,但更準確的單位是RPS。
由于無法兼具低延遲和高吞吐量,所以權衡之下的原則是:在確保延遲尚可接受的前提下,轉而追求最大的吞吐量

可用性與一致性

關于可用性與一致性,有個著名的CAP定理,可以查看往期筆記:CAP理論
在分布式計算機系統中,一致性、可用性和分區容錯性三者只能擇其二(而且分區容錯性必選):

  • 一致性(Consistency):每次讀取都能得到最新寫入的結果,抑或出錯
  • 可用性(Availability):每個請求都能收到正常響應,但不保證返回的是最新信息
  • 分區容錯性(Partition Tolerance):即便有一部分由于網絡故障down掉了,系統仍能繼續運行

因為網絡不完全可靠,所以必須保證分區容錯性(P必選)。當部分節點出現網絡故障時,有2個選擇:

  • 取消操作:能確保一致性,但會降低可用性(用戶可能收到超時錯誤),即CP(Consistency and Partition Tolerance),適用于需要原子讀寫的場景
  • 繼續操作:保證可用性,但存在一致性風險(返回的信息可能是舊的),即AP(Availability and Partition Tolerance),適用于可接受最終一致性(Eventual consistency)的場景

在P必須滿足的前提下(網絡故障是系統之外的不可控因素,沒得選),只能在C和A之間進行取舍,要么保證一致性(犧牲可用性),要么保證可用性(犧牲一致性)。在中心化系統(例如RDBMS)中,不存在網絡可靠性的問題,此時C和A能夠兩全

一致性模式

同一數據存在多份拷貝,那么就需要考慮如何保證其一致性。而嚴格的一致性意味著要么讀到最新數據,要么出錯。但并非所有場景下都需要達到這樣的一致性要求,所以出現了弱一致性與最終一致性等妥協產物。
弱一致性
寫完之后,不一定能讀到。弱一致性模式(Weak consistency)適用于網絡電話、視頻聊天、實時多人游戲等實時場景,而網絡電話斷線重連后,不會再收到斷線期間的通話內容
最終一致性
寫完之后,異步復制數據,保證最終能讀到。最終一致性模式(Eventual consistency)適用于DNS、email等高可用系統
強一致性
寫完之后,同步復制數據,立即就能讀到
強一致性模式(Strong consistency)適用于文件系統、RDBMS等需要事務機制的場景

可用性模式

可用性保障方面,主要有兩種方式:故障轉移與復制
故障轉移
一個節點down掉之后,迅速用另一個點代替它,以縮減宕機時間。具體的,有兩種故障轉移模式:

  • 主動-被動(主從故障轉移):只由主動服務器處理流量,在工作的主動服務器與待命的被動服務器之間發送心跳包,如果心跳斷了,由被動服務器接管主動服務器的IP地址并恢復服務,宕機時間的長短取決于被動機器是熱啟動還是冷啟動
    1、冷啟動:當啟動應用時,后臺沒有該應用的進程,這時系統會重新創建一個新的進程分配給該應用,這個啟動方式就是冷啟動。2、熱啟動:當啟動應用時,后臺已有該應用的進程(例:按back鍵、home鍵,應用雖然會退出,但是該應用的進程是依然會保留在后臺,可進入任務列表查看),所以在已有進程的情況下,這種啟動會從已有的進程中來啟動應用,這個方式叫熱啟動。
    
  • 主動-主動(主主故障轉移):兩臺服務器都處理流量,共同承擔負載

主動-被動模式下,(切換時)存在數據丟失的風險,而且無論哪種方式,故障轉移都會增加硬件資源和復雜度
復制
分為主從復制與主主復制,多用于數據庫,可以參考往期文章:
https://hanhandi.blog.csdn.net/article/details/115447488
https://hanhandi.blog.csdn.net/article/details/115459092

可用性衡量

對于由多部分組成的服務,其整體可用性取決于這些組成部分是串行的還是并行的:
可用性都達不到100%的兩個服務組合起來,如果是串行的,其整體可用性會下降(99.9% * 99.9% = 99.8%),而并行的話,整體可用性會提高(1 - 0.1% * 0.1% = 99.9999%)
可用性通常用幾個9來衡量,表示服務可用時間占運行時間的百分比

圖1 99.9%
圖2 99.99%

參考

http://www.ayqy.net/blog/trade-offs-in-system-design/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376591.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376591.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376591.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS中使用子線程的完整方法

第一步:開啟子線程 //開啟子線程到網絡上獲取數據myFirstThread [[NSThread alloc]initWithTarget:self selector:selector(thread1GetData) object:nil];[myFirstThread setName:"第一個子線程,用于獲取網絡數據"];[myFirstThread start]; 第二步&…

DIV的表單布局

表單布局其實用表格最好了&#xff0c;可是表格的話&#xff0c;無法定位&#xff0c;這個是一個硬傷。 <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>表單布局</title> <link rel"stylesheet" …

后臺系統可擴展性學習筆記(三)DNS機制原理

文章目錄DNS概念梳理域名基本概念資源記錄基本概念路由策略DNS 域空間結構實現原理復制機制查詢機制緩存機制參考DNS概念梳理 DNS&#xff08;Domain Name System&#xff09;相當于互聯網的通訊錄&#xff0c;能夠把域名翻譯成 IP 地址。 從技術角度來講&#xff0c;DNS 是個…

后臺系統可擴展性學習筆記(四)CDN機制原理

文章目錄概念梳理CDN拓撲結構CDN內容分發方式架構原理工作原理實現原理概念梳理 CDN&#xff08;Content Delivery Network&#xff0c;內容分發網絡&#xff09;是由分布在不同地理位置的代理服務器及其數據中心組成的網絡&#xff0c;希望在空間距離上為用戶就近提供服務&am…

Javascript 基礎—變量 運算符

經過找工作筆試的洗禮&#xff0c;感覺自己js語法方面掌握的不是很系統&#xff0c;今天來梳理下——變量以及運算符。 基礎篇 和C語言的不同點&#xff1a;是一種弱類型語言&#xff0c;申明變量時不需要指定類型&#xff1b;變量名的命名方法也有不同&#xff1b;簡單類型種類…

后臺系統可擴展性學習筆記(五)負載均衡

文章目錄Load balancer(負載均衡器)請求傳輸拆解DNS 負載均衡客戶端負載均衡OSI 七層模型回顧2 層、3 層負載均衡3/4 層負載均衡7 層負載均衡在 第一節談到了系統的橫向擴展在于從單機擴展到多機&#xff0c;那么面臨的第一個問題就是這些機器如何協同工作&#xff0c;即如何調…

Struts2第一個工程helloStruts極其基本配置

前面已經準備好了Struts-2.3.15&#xff0c;現在就可以直接搭建Struts2的工程了。前面http://blog.csdn.net/huangchnegdada/article/details/9179041有對Struts-2.3.15的準備工作的詳述。 首先打開MyEclispe新建一個Web Project&#xff0c;名字就叫Struts2_0100_Introduction…

[LeetCode]Find Minimum in Rotated Sorted Array

題目描述&#xff1a; Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). Find the minimum element. You may assume no duplicate exists in the array. 解題方案&#xff1a; 直接貼代碼&…

后臺系統可擴展性學習筆記(六)反向代理

文章目錄Web代理服務反向代理反向代理作用Web代理服務 Web 代理服務指的是在客戶端資源請求和提供這些資源的 Web 服務之間充當中介的角色&#xff0c;代理服務可以實現在客戶端&#xff0c;或者從客戶端到目標服務器中間的任意環節。 例如&#xff0c;客戶端不直接向提供目標…

(C)單鏈表

老師版 1 #include <stdio.h>2 #include <stdlib.h>3 4 // 定于Node數據類型5 struct Node6 {7 int data; // 數據域8 struct Node *next; // 指針域9 };10 11 // 創建一個單鏈表&#xff0c;并把head節點返回&#xff1b;…

實驗:sigsuspend(),sigprocmask()

實驗&#xff1a;sigsuspend(),sigprocmask()源代碼&#xff1a;/* * Program: pause_suspend.c * To test the difference between sigsuspend() and paus(). * Author: zsl * Date: 2014-10-17 * First release. * 參見網頁&#xff1a;http://blog.csdn.net/liwentao1091/ar…

后臺系統可擴展性學習筆記(七)Service Discovery與微服務

文章目錄應用層微服務架構服務注冊查詢 Service Discovery客戶端 Service DiscoveryDNS-SD DNS-based Service Discovery服務端 Service Discovery服務注冊與注銷自注冊模式第三方注冊模式總結參考應用層 在簡單的 3 層結構中&#xff0c;Web 服務層既要處理請求&#xff0c;又…

很久沒寫代碼了,這(那)幾天真是累死了。。。先寫一個幻方的程序吧

1 #include <stdio.h>2 #include <stdlib.h>3 #include <windows.h>4 5 #define EVEN_DOUBLE_4 4 //雙偶的最基本類型&#xff0c;4階雙偶6 #define SCREEN_SIZE 19 //屏幕顯示不變形的最大尺寸&#xff08;主要是因為窗口大小限制&#xff09;7 #defi…

#pragma once

http://baike.baidu.com/view/1276747.htm?fraladdin 轉載于:https://www.cnblogs.com/prayer521/p/4069040.html

后臺系統可擴展性學習筆記(八)Service Mesh

文章目錄網絡傳輸可靠性將微服務控制下沉到網絡棧&#xff1f;Sidecar從 Sidecar 到 Service MeshService Mesh 部署平臺參考網絡傳輸可靠性 從計網的學習過程中我們可以知道數據在網絡傳輸中可能會出現一些異常狀況&#xff1a; 數據丟失&#xff1a;數據包可能會到達一個緩…

關于Spring batch的學習之CSV2DB

最近在學習Spring batch相關的內容&#xff0c;網上也有不少Spring Batch相關的知識&#xff0c;不過大多都是使用xml進行配置的。這里是我用注解的方式進行相關的學習心得。 首先我們來看如何將一個文本文件中的內容導入到數據庫中。 我們先來看一下我們所需要的環境。我們這里…

后臺系統可擴展性學習筆記(九)Database Replication

文章目錄數據庫擴展一致性問題Replication &#xff08;復制&#xff09;異步復制同步復制半同步復制拓撲結構單主結構多主結構無主結構復制具體措施參考數據庫擴展 之前在第一章后臺系統可擴展性學習筆記&#xff08;一&#xff09;概要談到&#xff1a;理論上&#xff0c;有…

python中的sum函數.sum(axis=1)

看起來挺簡單的樣子&#xff0c;但是在給sum函數中加入參數。sum&#xff08;a&#xff0c;axis0&#xff09;或者是.sum(axis1) 就有點不解了 在我實驗以后發現 我們平時用的sum應該是默認的axis0 就是普通的相加 而當加入axis1以后就是將一個矩陣的每一行向量相加 例如&…

后臺系統可擴展性學習筆記(十)Database Partitioning

為了提升數據庫的處理能力&#xff0c;我們把單庫擴展成多庫&#xff0c;并通過更新同步機制&#xff08;即Replication&#xff09;來保證多份數據的一致性。然而&#xff0c;在 各種復制方案下&#xff0c;每個數據庫都持有一份完整數據&#xff0c;基于全量數據提供增刪改查…