首頁 Java java教程 Java高並發架構設計的介紹(圖文)

Java高並發架構設計的介紹(圖文)

Oct 20, 2018 pm 05:29 PM
javascript java

這篇文章帶給大家的內容是關於Java高並發架構設計的介紹(圖文),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

序言

高並發經常會發生在有大活躍用戶量,用戶高聚集的業務場景中,如:秒殺活動,定時領取紅包等。

為了讓業務可以流暢的運作並且給使用者一個好的互動體驗,我們需要根據業務場景預估達到的並發量等因素,來設計適合自己業務場景的高並發處理方案。

影片課程推薦→:《千萬級資料並發解決方案(理論實戰)》

在電商相關產品開發的這些年,我有幸的遇到了並發下的各種坑,這一路摸爬滾打過來有著不少的血淚史,這裡進行的總結,作為自己的歸檔記錄,同時分享給大家。

一丶伺服器架構

業務從發展的初期到逐漸成熟,伺服器架構也是從相對單一到集群,再到分散式服務。

一個可以支援高並發的服務少不了好的伺服器架構,需要有均衡負載,資料庫需要主從集群,nosql快取需要主從集群,靜態檔案需要上傳cdn,這些都是能讓業務程序流暢運行的強大後盾。

伺服器這塊多是需要維運人員來配合搭建,具體我就不多說了,點到為止。

大致上需要用到的伺服器架構如下:

伺服器

平衡負載(如:nginx,阿里雲SLB)

資源監控

分散式

資料庫

#主從分離,叢集

DBA 表最佳化,索引最佳化,等

#分佈式

nosql

主從分離,集群

主從分離,集群

主從分離,集群

redis

mongodb

memcache

cdn

html

css

##js

image

#並發測試

高並發相關的業務,需要進行並發的測試,透過大量的資料分析評估整個架構可以支撐的並發量。

測試高並發可以使用第三方伺服器或自己測試伺服器,利用測試工具進行並發請求測試,分析測試資料得到可以支撐並發數量的評估,這個可以作為一個預警參考,俗話說知己自彼百戰不殆。

第三方服務:

阿里雲效能測試

#並發測試工具:

Apache JMeter

Visual Studio效能負載測試

Microsoft Web Application Stress Tool

實戰方案

通用方案

日用戶流量大,但是比較分散,偶爾會有用戶高聚的情況;

場景: 使用者簽到,使用者中心,使用者訂單,等

伺服器架構圖:

Java高並發架構設計的介紹(圖文)

說明:

場景中的這些業務基本上是用戶進入APP後會操作到的,除了活動日(618,雙11,等),這些業務的用戶量都不會高聚集,同時這些業務相關的表都是大數據表,業務多是查詢操作,所以我們需要減少用戶直接命中DB的查詢;優先查詢緩存,如果緩存不存在,再進行DB查詢,將查詢結果快取起來。

更新使用者相關快取需要分散式存儲,例如使用使用者ID進行hash分組,把使用者分散到不同的快取中,這樣一個快取集合的總量不會很大,不會影響查詢效率。

方案如:

用戶簽到獲取積分

#計算用戶分佈的key,redis hash中查找用戶今日簽到資訊

如果查詢到簽到信息,返回簽到信息

如果沒有查詢到,DB查詢今天是否簽到過,如果有簽到過,就把簽到信息同步redis緩存。

如果DB中也沒有查詢到今日的簽到記錄,就進行簽到邏輯,操作DB添加今日簽到記錄,添加簽到積分(這整個DB操作是一個事務)

快取簽到訊息到redis,返回簽到訊息

注意

這裡會有並發情況下的邏輯問題,如:一天簽到多次,發放多次積分給使用者。

我的部落格文章[大話程式猿眼裡的高並發]有相關的處理方案。

用戶訂單

這裡我們只快取用戶第一頁的訂單信息,一頁40條數據,用戶一般也只會看第一頁的訂單數據

用戶存取訂單列表,如果是第一頁讀取緩存,如果不是讀DB

計算用戶分佈的key,redis hash中查找用戶訂單資訊

如果查詢到用戶訂單信息,返回訂單信息

如果不存在就進行DB查詢第一頁的訂單數據,然後緩存redis,返回訂單信息

用戶中心

計算出用戶分佈的key ,redis hash中查找用戶訂單資訊

如果查詢到用戶信息,返回用戶資訊

#如果不存在進行用戶DB查詢,然後緩存redis,返回用戶資訊

其他業務

以上例子是一個相對簡單的高並發架構,並發量不是很高的情況可以很好的支撐,但是隨著業務的壯大,用戶並發量增加,我們的架構也會進行不斷的最佳化和演變,例如對業務進行服務化,每個服務有自己的並發架構,自己的均衡伺服器,分散式資料庫,nosql主從集群,如:用戶服務、訂單服務;

訊息佇列

秒殺、秒搶等活動業務,使用者在瞬間湧入產生高並發請求

場景:定時領取紅包,等

伺服器架構圖:

Java高並發架構設計的介紹(圖文)

#說明:

場景中的定時領取是一個高並發的業務,像秒殺活動用戶會在到點的時間湧入,DB瞬間就接受到一記暴擊,hold不住就會宕機,然後影響整個業務;

像這種不是只有查詢的操作並且會有高並發的插入或更新資料的業務,前面提到的通用方案就無法支撐,並發的時候都是直接命中DB;

設計這塊業務的時候就會使用訊息佇列的,可以將參與使用者的信息加入到訊息佇列中,然後再寫個多執行緒程式去消耗佇列,給佇列中的使用者發放紅包;

方案如:

定時領取紅包

一般習慣使用redis的list

當使用者參與活動,將使用者參與資訊push到佇列中

然後寫個多線程程式去pop數據,進行發放紅包的業務

這樣可以支援高並發下的用戶可以正常的參與活動,並且避免資料庫伺服器宕機的危險

一級快取

高並發請求連線快取伺服器超出伺服器能夠接收的請求連線量,部分使用者出現建立連線逾時無法讀取到資料的問題;

因此需要有個方案當高並發時候時候可以減少命中快取伺服器;

這時候就出現了一級快取的方案,一級快取就是使用網站伺服器快取去儲存數據,注意只儲存部分請求量大的數據,並且緩存的數據量要控制,不能過分的使用站點伺服器的內存而影響了站點應用程序的正常運行,一級緩存需要設置秒單位的過期時間,具體時間根據業務場景設定,目的是當有高並發請求的時候可以讓資料的獲取命中到一級緩存,而不用連接緩存nosql數據伺服器,減少nosql數據伺服器的壓力

比如APP首屏商品數據接口,這些數據是公共的不會針對使用者自定義,而且這些資料不會頻繁的更新,像這種介面的請求量比較大就可以加入一級快取;

##伺服器架構圖:

Java高並發架構設計的介紹(圖文)

合理的規格和使用nosql快取資料庫,根據業務拆分快取資料庫的集群,這樣基本上可以很好支援業務,一級緩存畢竟是使用網站伺服器快取所以還是要善用。

靜態化資料

高並發請求資料不變化的情況下如果可以不請求自己的伺服器取得資料那就可以減少伺服器的資源壓力。

對於更新頻繁度不高,且資料允許短時間內的延遲,可以透過資料靜態化成JSON,XML,HTML等資料檔案上傳CDN,在拉取資料的時候優先到CDN拉取,如果沒有取得到資料再從緩存,資料庫中獲取,當管理人員操作後台編輯資料再重新產生靜態檔案上傳同步到CDN,這樣在高並發的時候可以使資料的取得命中在CDN伺服器上。 CDN節點同步有一定的延遲性,所以找一個可靠的CDN伺服器商也很重要。

Java高並發架構設計的介紹(圖文)


以上是Java高並發架構設計的介紹(圖文)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java Spring 面試題 Java Spring 面試題 Aug 30, 2024 pm 04:29 PM

在本文中,我們保留了最常被問到的 Java Spring 面試問題及其詳細答案。這樣你就可以順利通過面試。

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

Java程序查找膠囊的體積 Java程序查找膠囊的體積 Feb 07, 2025 am 11:37 AM

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP與Python:核心功能 PHP與Python:核心功能 Apr 13, 2025 am 12:16 AM

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

創造未來:零基礎的 Java 編程 創造未來:零基礎的 Java 編程 Oct 13, 2024 pm 01:32 PM

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。

See all articles