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

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

Oct 20, 2018 pm 05:29 PM
javascriptjava

這篇文章帶給大家的內容是關於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中文網其他相關文章!

陳述
本文轉載於:segmentfault思否。如有侵權,請聯絡admin@php.cn刪除
在Java應用程序中緩解平台特定問題的策略是什麼?在Java應用程序中緩解平台特定問題的策略是什麼?May 01, 2025 am 12:20 AM

Java如何緩解平台特定的問題? Java通過JVM和標準庫來實現平台無關性。 1)使用字節碼和JVM抽像操作系統差異;2)標準庫提供跨平台API,如Paths類處理文件路徑,Charset類處理字符編碼;3)實際項目中使用配置文件和多平台測試來優化和調試。

Java的平台獨立性與微服務體系結構之間有什麼關係?Java的平台獨立性與微服務體系結構之間有什麼關係?May 01, 2025 am 12:16 AM

java'splatformentenceenhancesenhancesmicroservicesharchitecture byferingDeploymentFlexible,一致性,可伸縮性和便攜性。 1)DeploymentFlexibilityAllowsibilityAllowsOllowsOllowSorlowsOllowsOllowsOllowSeStorunonAnyPlatformwithajvM.2)penterencyCrossServAccAcrossServAcrossServiCessImplifififiesDeevelopmentandeDe

GRAALVM與Java的平台獨立目標有何關係?GRAALVM與Java的平台獨立目標有何關係?May 01, 2025 am 12:14 AM

GraalVM通過三種方式增強了Java的平台獨立性:1.跨語言互操作,允許Java與其他語言無縫互操作;2.獨立的運行時環境,通過GraalVMNativeImage將Java程序編譯成本地可執行文件;3.性能優化,Graal編譯器生成高效的機器碼,提升Java程序的性能和一致性。

您如何測試Java應用程序的平台兼容性?您如何測試Java應用程序的平台兼容性?May 01, 2025 am 12:09 AM

效率testjavaapplicationsforplatformcompatibility oftheSesteps:1)setUpautomatedTestingTestingActingAcrossMultPlatFormSusingCitoolSlikeSlikeJenkinSorgithUbactions.2)contuctualtemualtemalualTesteTESTENRETESTINGINREALHARTWARETOLEALHARDOELHARDOLEATOCATCHISSUSESUSEUSENINCIENVIRENTMENTS.3)schictcross.3)schoscross.3)

Java編譯器(Javac)在實現平台獨立性中的作用是什麼?Java編譯器(Javac)在實現平台獨立性中的作用是什麼?May 01, 2025 am 12:06 AM

Java編譯器通過將源代碼轉換為平台無關的字節碼,實現了Java的平台獨立性,使得Java程序可以在任何安裝了JVM的操作系統上運行。

在平台獨立性的平台獨立性上使用字節碼優於本機代碼的優點是什麼?在平台獨立性的平台獨立性上使用字節碼優於本機代碼的優點是什麼?Apr 30, 2025 am 12:24 AM

ByteCodeachievesPlatFormIndenceByByByByByByExecutedBoviratualMachine(VM),允許CodetorunonanyplatformwithTheApprepreprepvm.Forexample,Javabytecodecodecodecodecanrunonanydevicewithajvm

Java真的100%獨立於平台嗎?為什麼或為什麼不呢?Java真的100%獨立於平台嗎?為什麼或為什麼不呢?Apr 30, 2025 am 12:18 AM

Java不能做到100%的平台獨立性,但其平台獨立性通過JVM和字節碼實現,確保代碼在不同平台上運行。具體實現包括:1.編譯成字節碼;2.JVM的解釋執行;3.標準庫的一致性。然而,JVM實現差異、操作系統和硬件差異以及第三方庫的兼容性可能影響其平台獨立性。

Java的平台獨立性如何支持代碼可維護性?Java的平台獨立性如何支持代碼可維護性?Apr 30, 2025 am 12:15 AM

Java通過“一次編寫,到處運行”實現平台獨立性,提升代碼可維護性:1.代碼重用性高,減少重複開發;2.維護成本低,只需一處修改;3.團隊協作效率高,方便知識共享。

See all articles

熱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

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

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境