設計高併發場景下的高可用後端系統
PS:前段時間和Mentor們一起參與研發”百度地圖百城千店感恩節AR遊戲送大禮”的後端專案,積累了一些高併發情景下的系統設計經驗,這裡統一抽象成【秒殺情景下的後端系統】,歸納總結一下學習到的知識點。
轉載地址:http://blog.daijiale.cn/2016/12/07/%E3%80%90%E5%90%8E%E7%AB%AF%E3%80%91%E8%AE%BE%E8%AE%A1%E9%AB%98%E5%B9%B6%E5%8F%91%E5%9C%BA%E6%99%AF%E4%B8%8B%E7%9A%84%E5%90%8E%E7%AB%AF%E7%B3%BB%E7%BB%9F/?utm_source=tuicool&utm_medium=referral
背景
為什麼要構建一個高併發場景下的後端系統?
技術角度:業務規模覆蓋使用者群大,資料聯通實時性強,響應時間要求極短,需要高可用,高併發。
市場角度:使用者體驗、曝光度、促銷(秒殺)等。
簡而言之,就是讓自己編寫的系統應用做到如何更優雅的”接客”。
好,現在我們來看看,如何用正確的”姿勢”來”接客”?
設計思路
設計層面需要考慮的Points
Point1:靜態頁面設計
- cdn託管
- 網址隱藏
- 頁面壓縮
- 快取機制
Point2:動態頁面設計
- 佇列設定
- 樂觀鎖(利用redis原子操作實現)
- 非同步呼叫
- 資質搶購
Point3:高可用(雙活)
雙活:讓主備兩個資料中心都同時承擔使用者的業務,此時,主備兩個資料中心互為備份,並且進行實時備份,尤其是在快取層和DB層。
Point4:高併發(負載均衡,安全過濾)
負載均衡:分軟體層、硬體層、鏈路層,但不管哪一層,主要有兩種通用常用技術思路:第一種是將大量的同時傳送的資料流在多個節點上進行處理。第二種是將單一負載的大量分擔在多個節點上進行並行處理,並且在所有節點都完成處理後將結果合併起來輸出給使用者。而現在,負載均衡技術已經不是什麼新鮮技術,一般維護過伺服器,或有兩臺以上的伺服器都可以使用負載均衡技術。
安全過濾:設定比較完備的rules過濾器。
Point5: 資料庫設計注意靜態配置和動態資料分離
靜態配置:在前端頁面主要呈現內容為主,在介面層主要只讀
的資料欄位。
動態資料:頻繁更新,頻繁檢索的資料欄位。
Point6:快取雪崩
注意設定快取失效時間,不然超出redis快取最大記憶體,溢位講導致雪崩。
Point7:快取擊穿
注意設定快取失效時間的隨機性,別同一時間同時失效,瞬間同時失效將導致密集的IO讀寫操作,容易導致快取擊穿。
Point8:脫離原站點部署
簡而言之就是:千萬不要把雞蛋放在一個籃子裡!!!
分業務分散式部署
- 定義:一個業務分拆成多個子業務,部署在不同的伺服器上。
- 好處:強調機器間的協作,其重點是任務可拆分,如:某個任務需要一個機器執行10個小時, 將該該任務用10臺機器的分散式跑,可能2個小時就跑完了。(子任務之間有依賴關係)。
- 壞處:中心化帶來的主要問題是可靠性,若中心節點宕機則整個系統不可用,分散式除了解決部分中心化問題,也傾向於分散負載,但分散式會帶來很多的其他問題,最主要的就是一致性。
分容器分散式部署
- 定義:俗稱”叢集”,同一個業務,部署在多個伺服器容器上。為的
- 好處:同一個業務部署在多臺機器上,提高系統可用性。如:某個任務需要一個機器執行10個小時,那任務放到 處理該任務的叢集上 還是需要10個小時。 假如有10個這樣的任務, 放到同一個叢集上, 仍然需要10個小時,但是由於掛載的機器來自不同地域節點,可以提升頻寬上的物理傳輸速度,一臺伺服器垮了,其它的伺服器可以頂上來。
- 壞處:整體效能難得到顯著得提升,受業務內極端需求峰值限制。
PS: “沒有最好的方式,只有最適合的方式”,不同的業務場景需求,不同的模組:資料庫、快取、訊息中介軟體、媒體資源、系統應用等,需要選用不同的部署方案才能達到高可用,當然,一般更建議兩種方式組合部署。
Point9:監控+監控+監控(總要事情說三遍!)
系統研發完成,測試通過並不代表就結束了,一個高併發系統最關鍵的時期往往是在活動的峰值期間,為了不讓RD們24小時目不轉睛地盯著所有可能出現問題的地方,最好在關鍵處加上異常監控資訊,以便及時對異常事件做出響應。
這裡介紹兩個開源監控專案:
大廠的成熟解決方案
- 在百度的解決方案:百度雲、
opcode快取
、BigPipe
、BDRP(RedisV3)叢集
、ORP叢集
、CDN分流
,hiphoto
等更大的雲實例。
- 從阿里同學那得知的一些那邊的解決方案:活用阿里雲服務,譬如
雲監控
、雲盾
、ECS
、OSS
、RDS
、CDN
分流,這些大都已經是面向大眾的商業產品。
個人開發者/創業公司的解決方案
回頭單開一篇文章介紹,留個傳送門。
研發策略
一、認清業務的環境、形式
- 使用者緯度:超大量,正常使用者/惡意使用者。
- 地域:全國各地。
- 業務流程:
- 【前臺】卡券、獎品展示,領用登記等。
- 【後臺】資料接入、資料處理、資料同步、資料錄入、庫存管理。
- 【前臺】卡券、獎品展示,領用登記等。
通用的業務場景如下:
二、分析業務的狀態
商品/獎品展示層
- 商品/獎品展示:秒殺倒計時頁面。
- 秒殺進行中:點選進入秒殺頁面。
- 秒殺活動結束:提示活動已結束。
技術細節
頁面/伺服器優化,依賴包cdn網路加速部署,隱藏跳轉頁面,狀態切換(sh指令碼設定定時任務實現),這裡就不擴充套件了,現在應對大型Web系統的成熟前端頁面技術棧特別多。
使用者登記層
技術細節
token加/解密(加密協議自己擬訂)
ajax跨域(常用jsonp)
資料接入層
- 資料校驗:完成對資料、使用者驗證(安全和速度均要考慮)。
- 存入nosql訊息佇列:去重/排序/快取/檢索資料。
- 檢測商品最大數量:提示活動已結束。
技術細節
資料校驗
存入nosql訊息佇列
資料處理層
- 資料持久化:轉存nosql資料到mysql資料庫,主要為dao層DB操作。
- DB優化:DB分表,DB表擴充套件,DB遷移。
- 轉存:sql轉存,匯出excel列印稽核。
技術細節
三、根據狀態進行程式碼模組層面的設計
四、全量的壓力測試
簡而言之:正式表演前,請務必帶裝彩排一輪
相關推薦
設計高併發場景下的高可用後端系統
PS:前段時間和Mentor們一起參與研發”百度地圖百城千店感恩節AR遊戲送大禮”的後端專案,積累了一些高併發情景下的系統設計經驗,這裡統一抽象成【秒殺情景下的後端系統】,歸納總結一下學習到的知識點。轉載地址:http://blog.daijiale.cn/2016/12/0
高併發場景下的快取 資料庫雙寫不一致問題分析與解決方案設計
馬上開始去開發業務系統 從哪一步開始做,從比較簡單的那一塊開始做,實時性要求比較高的那塊資料的快取去做 實時性比較高的資料快取,選擇的就是庫存的服務 庫存可能會修改,每次修改都要去更新這個快取資料; 每次庫存的資料,在快取中一旦過期,或者是被清理掉了,前端的ngin
25-02、高併發場景下的快取+資料庫雙寫不一致問題分析與解決方案設計
馬上開始去開發業務系統, 從哪一步開始做,從比較簡單的那一塊開始做,實時性要求比較高的那塊資料的快取去做, 實時性比較高的資料快取,選擇的就是庫存的服務, 庫存可能會修改,每次修改都要去更新這個快取資料; 每次庫存的資料,在快取中一旦過期,或者是被清理掉了,前端的nginx服務都會發送請
高併發場景下快取+資料庫雙寫不一致問題分析與解決方案設計
能堅持別人不能堅持的,才能擁有別人不能擁有的。 文章首發於左上角公眾號,同步到部落格園會延遲一到兩天。 關注程式設計大道公眾號,讓我們一同堅持心中所想,一起成長!! Redis是企業級系統高併發、高可用架構中非常重要的一個環節。Redis主要解決了關係型資料庫併發量低的問題,有助於緩
高併發場景下的快取有哪些常見的問題?
一、快取一致性問題 當資料時效性要求很高時,需要保證快取中的資料與資料庫中的保持一致,而且需要保證快取節點和副本中的資料也保持一致,不能出現差異現象。 這就比較依賴快取的過期和更新策略。一般會在資料發生更改的時,主動更新快取中的資料或者移除對應的快取。 二、快取併發
快取在高併發場景下的常見問題 侵立刪
快取一致性問題 當資料時效性要求很高時,需要保證快取中的資料與資料庫中的保持一致,而且需要保證快取節點和副本中的資料也保持一致,不能出現差異現象。這就比較依賴快取的過期和更新策略。一般會在資料發生更改的時,主動更新快取中的資料或者移除對應的快取。
高併發場景下的快取+資料庫雙寫不一致問題分析與解決方案
1、最初級的快取不一致問題以及解決方案問題:先修改資料庫,再刪除快取,如果刪除快取失敗了,那麼會導致資料庫中是新資料,快取中是舊資料,資料出現不一致。解決思路:先刪除快取,再修改資料庫,如果刪除快取成功了,如果修改資料庫失敗了,那麼資料庫中是舊資料,快取中是空的,那麼資料不會
高併發場景下請求合併的實踐
前言 專案中一般會請求第三方的介面,也會對外提供介面,可能是RPC,也可能是HTTP等方式。在對外提供介面時,有必要提供相應的批量介面,好的批量實現能夠提升效能。 高併發場景中,呼叫批量介面相比呼叫非批量介面有更大的效能優勢。但有時候,請求更多的是單個介面,不能夠直接呼叫批量介面,如果這個介面是高頻介面,
併發經驗八年架構師:快取在高併發場景下該如何問題
快取一致性問題當資料時效性要求很高時,需要保證快取中的資料與資料庫中的保持一致,而且需要保證快取節點和副本中的資料也保持一致,不能出現差異現象。這就比較依賴快取的過期和更新策略。一般會在資料發生更改的時,主動更新快取中的資料或者移除對應的快取。快取併發問題快取過期後將嘗試從後
二十五、高併發場景下HttpClient的優化使用
1.背景 我們有個業務,會呼叫其他部門提供的一個基於http的服務,日呼叫量在千萬級別。使用了httpclient來完成業務。之前因為qps上不去,就看了一下業務程式碼,並做了一些優化,記錄在這裡。 先對比前後:優化之前,平均執行時間是250ms;優化之後,平均執行時間是80ms
高併發場景下oracle觸發器+序列產生序號的一些現象與思考
最近工作上因為在處理系統同步的時候遇到了一些問題,在解決過程中,發現了一些現象,所以在這裡mark一下,我現有的殘缺理論體系還無法支撐做出合理的解釋,在網上找了一下,也沒有找到類似的案例,還望各位大拿指點一二。 話不多說,直接上案例,在pl/sql上做的模擬。 原始案例(
MySQL在大資料、高併發場景下的SQL語句優化
本文主要針對中小型應用或網站,重點探討日常程式開發中SQL語句的優化問題,所謂“大資料”、“高併發”僅針對中小型應用而言,專業的資料庫運維大神請無視。以下實踐為個人在實際開發工作中,針對相對“大資料”和相對“高併發”場景的一些應對策略,部分措施並沒有經
HttpClient在高併發場景下的優化實戰
在專案中使用HttpClient可能是很普遍,尤其在當下微服務大火形勢下,如果服務之間是http呼叫就少不了跟http客戶端找交道.由於專案使用者規模不同以及應用場景不同,很多時候可能不需要特別處理也.然而在一些高併發場景下必須要做一些優化. 專案是快遞公司的快件軌跡查詢專案,目前平均每小時呼叫量千萬級別
高併發場景下鎖的使用技巧
如何確保一個方法,或者一塊程式碼在高併發情況下,同一時間只能被一個執行緒執行,單體應用可以使用併發處理相關的 API 進行控制,但單體應用架構演變為分散式微服務架構後,跨程序的例項部署,顯然就沒辦法通過應用層鎖的機制來控制併發了。那麼鎖都有哪些型別,為什麼要使用鎖,鎖的使用場景有哪些?今天我們來聊一聊高併
【大廠面試01期】高併發場景下,如何保證快取與資料庫一致性?
> PS:本文已收錄到1.1K Star數開源學習指南——《大廠面試指北》,如果想要了解更多大廠面試相關的內容及獲取《大廠面試指北》離線PDF版,請掃描下方二維碼碼關注公眾號“大廠面試”,謝謝大家了!專案地址:https://github.com/NotFound9/interviewGuide **
【高併發】面試官:講講高併發場景下如何優化加鎖方式?
## 寫在前面 > 很多時候,我們在併發程式設計中,涉及到加鎖操作時,對程式碼塊的加鎖操作真的合理嗎?還有沒有需要優化的地方呢? ## 前言 在《[【高併發】優化加鎖方式時竟然死鎖了!!](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&
高併發場景下如何優化伺服器的效能?
## 寫在前面 最近,有小夥伴在群裡提問:Linux系統怎麼設定tcp_nodelay引數?也有小夥伴說問我。那今天,我們就來根據這個問題來聊聊在高併發場景下如何優化伺服器的效能這個話題。 ![](https://img-blog.csdnimg.cn/20210113003037250.png) 其
高併發場景系列(一) 利用redis實現分散式事務鎖,解決高併發環境下減庫存
問題描述:某電商平臺,首發一款新品手機,每人限購2臺,預計會有10W的併發,在該情況下,如果扣減庫存,保證不會超賣 方案一 利用資料庫鎖機制,對記錄進行鎖定,再進行操作 SELECT * from goods where ID =1 for updat
高併發情況下Redis 的可用性測試與分析及部署架構說明
1、讀取Redis的timeout異常 建立執行緒數在50以下時程式可以正常執行,當執行緒數設定為100以上時,某些執行緒執行出現異常: java.net.SocketTimeoutException: Read timed out 造成這種異常可能有以下兩個原因: 原因一:在連線Redis的Jedis的預設
SpringBoot實戰實現分散式鎖一之重現多執行緒高併發場景
實戰前言:上篇博文我總體介紹了我這套視訊課程:“SpringBoot實戰實現分散式鎖” 總體涉及的內容,從本篇文章開始,我將開始介紹其中涉及到的相關知識要點,感興趣的小夥伴可以關注關注學習學習!!工欲善其事,必先利其器,介紹分散式鎖使用的前因後果之前,得先想辦法說清楚為啥需要分散式鎖以及