如何構建併發系統

2021-09-24 16:35:54 字數 1780 閱讀 9436

本文簡單說明幾個設計併發系統時需要考慮的問題,內容摘抄自《go語言併發之道》

異常是什麼,什麼時候發生,提供了哪些好處

首先,異常需要傳達幾個關鍵資訊:

發生了什麼:

這部分異常資訊包括了歲異常時間的描述。例如:磁碟已滿,連線被重置,證書過期等

發生在什麼時間,什麼位置:

異常應該包含完整的軌跡資訊,從呼叫的啟動方式開始,已異常的例項結尾。棧軌跡資訊不應該被包含在異常資訊中,但當需要處理棧中的異常時應該很容易被找到

對使用者友好的資訊:應當對展現給使用者的資訊進行自定義,應該只包含前兩點的概述以及相關資訊。對使用者友好的資訊是從使用者的角度出發,給出一些資訊,說明這些資訊是否是暫時的,並且最好是一行以內的文字

告訴使用者如何獲取更多資訊:某些情況下,使用者希望知道當異常發生時具體發生了那些故障,展示給使用者的異常資訊應該提供乙個id,利用這個id可以查到對應的詳細日誌,日誌應該包含有完整的資訊(異常的發生時間和異常時的堆疊呼叫)

當展示給使用者的資訊不包含這些資訊,不是出錯了就是有bug。所以異常可以分為兩類:

為什麼要支援超時?

系統飽和

如果系統已經飽和(已經達到系統處理請求的能力),希望可以返回超時,而不是花很長的時間等待響應。

陳舊的資料

資料通常有乙個視窗期,一般是在這個視窗中先處理更多相關資料或者處理資料的需求已經過期。

如果知道視窗期,那麼將context.withdeadline或context.withtimeout建立的context傳遞給併發程序是有意義的,如果事先不知道視窗,我們希望併發程序的父節點能夠在不再需要時取消併發程序。context.withcancel是達到這個目的的最佳選擇

試圖防止死鎖

通過設定超時可以將乙個死鎖系統轉變為乙個活鎖系統,在系統死鎖後,很可能會遇到時序配置不同步的情況。因此最好是在允許餓時間內修復活鎖,好過發生死鎖後只能通過重啟系統才能恢復系統

這不是如何正確構建系統的建議,而是如何建立乙個對時間問題有容錯能力的系統

什麼時候應當設定超時

併發程序可能被取消的原因心跳是併發程序向外界發出訊號的一種方式。

心跳型別

golang通過channel傳送心跳的時候,需要注意有可能沒有人接收發出去的心跳(因為心跳不一定重要)

某些情況下,可以將請求分發到多個處理程式(goroutine,程序,或者伺服器均可),其中乙個將比其他程式更快的返回結果,這樣就可以立即返回結果。但是會消耗更多的資源。當多個處理程式需要多個程序,伺服器,或者資料中心時,代價會相當昂貴,所以要權衡是否值得這麼做

為什麼需要速率限制

通常對系統進行限速,可以避免系統被攻擊,如果惡意使用者在資源允許的情況下可以頻繁訪問系統,他們可以做各種事情。比如:使用日誌或有效請求打滿伺服器磁碟,或者ddos攻擊。

速率限制可以將系統的效能和穩定性平衡在可控範圍內

如何限速

大多數是基於令牌桶演算法的,相對容易實現。golang中 golang.org/x/time/rate

[github 位址] 包實現了這個功能

在乙個長期執行的程式中,建立乙個機制來監控你的goroutine是否處於健康狀態是很有用的,當goroutine異常時,可以盡快的重啟。重啟的過程成為「**」(healing)。

如何**goroutine?

使用心跳模式檢查我們正在監控的goroutine是否活躍。我們需要乙個管理員來監視乙個管理區的goroutine,如果有goroutine變得不健康,管理員負責重啟這個管理區的goroutine。

如何計算系統使用者併發數,系統最大併發數

根據我們對業務併發使用者數的定義,這500就是整個系統使用時最大的業務併發使用者數。當然,500這個數值只是表明在最高峰時刻有500個使用者登入了系統,並不表示實際伺服器承受的壓力。因為伺服器承受的壓力還與具體的使用者訪問模式相關。例如,在這500個 同時使用系統 的使用者中,考察某乙個時間點,在這...

如何快速構建CMBD系統 glpi

指令碼後續更新及迭代將由kkitdeploy專案代替 起初,開發這套cmbd系統是為了幫助朋友公司簡化裝置統計操作,以代替人工入庫方式。舉個例子,單位發放筆記本,或者裝置更換了硬碟,都需要人工簽到,手動輸入統計,安裝了cmbd系統後,系統就可以自動定時收集裝置資訊,以此來減少人工操作。下面給大家簡單...

MySQL 如何構建高效能MySQL系統

一 簡介 最近在壓測新的儲存,正好把工作過程中積累的對高效能mysql相關的知識體系構建起來,做成思維導圖的方式。總結乃一家之言,有不妥之處,望給位讀者朋友指正。二 思維導圖 構建高效能mysql系統涵蓋從單機 硬體,os 檔案系統,記憶體,到mysql 本身的配置,以及schema 設計,索引設計...