1. 程式人生 > >常見併發同步案例分析及 高併發的處理策略

常見併發同步案例分析及 高併發的處理策略

常見併發同步案例分析

    案例一:訂票系統案例,某航班只有一張機票,假定有1w個人開啟你的網站來訂票,問你如何解決併發問題(可擴充套件到任何高併發網站要考慮

               的併發讀寫問題)

    問題,1w個人來訪問,票沒出去前要保證大家都能看到有票,不可能一個人在看到票的時候別人就不能看了。到底誰能搶到,那得看這個人的“運氣”(網

             絡快慢等)

其次考慮的問題,併發,1w個人同時點選購買,到底誰能成交?總共只有一張票。

首先我們容易想到和併發相關的幾個方案 :

鎖同步同步更多指的是應用程式的層面,多個執行緒進來,只能一個一個的訪問,java中指的是syncrinized關鍵字。鎖也有2個層面,一個是java中談到的對

象鎖,用於執行緒同步;另外一個層面是資料庫的鎖;如果是分散式的系統,顯然只能利用資料庫端的鎖來實現。

假定我們採用了同步機制或者資料庫物理鎖機制,如何保證1w個人還能同時看到有票,顯然會犧牲效能,在高併發網站中是不可取的。使用hibernate後我們

提出了另外一個概念:樂觀鎖悲觀鎖(即傳統的物理鎖);

採用樂觀鎖即可解決此問題。樂觀鎖意思是不鎖定表的情況下,利用業務的控制來解決併發問題,這樣即保證資料的併發可讀性又保證儲存資料的排他性,保

證效能的同時解決了併發帶來的髒資料問題。

hibernate中如何實現樂觀鎖:

前提:在現有表當中增加一個冗餘欄位,version版本號, long型別

原理:

1)只有當前版本號》=資料庫表版本號,才能提交

2)提交成功後,版本號version ++

實現很簡單:在ormapping增加一屬性optimistic-lock="version"即可,以下是樣例片段

<hibernate-mapping>

<class name="com.insigma.stock.ABC" optimistic-lock="version" table="T_Stock" schema="STOCK">

案例二、股票交易系統、銀行系統,大資料量你是如何考慮的

首先,股票交易系統的行情表,每幾秒鐘就有一個行情記錄產生,一天下來就有(假定行情3秒一個) 股票數量×20×60*6 條記錄,一月下來這個表記錄數

量多大? oracle中一張表的記錄數超過100w後 查詢效能就很差了,如何保證系統性能?

再比如,中國移動有上億的使用者量,表如何設計?把所有用於存在於一個表麼?

所以,大數量的系統,必須考慮表拆分-(表名字不一樣,但是結構完全一樣),通用的幾種方式:(視情況而定)

1)按業務分,比如 手機號的表,我們可以考慮 130開頭的作為一個表,131開頭的另外一張表 以此類推

2)利用oracle的表拆分機制做分表

3)如果是交易系統,我們可以考慮按時間軸拆分,當日資料一個表,歷史資料弄到其它表。這裡歷史資料的報表和查詢不會影響當日交易。

當然,表拆分後我們的應用得做相應的適配。單純的or-mapping也許就得改動了。比如部分業務得通過儲存過程等

此外,我們還得考慮快取

這裡的快取,指的不僅僅是hibernate,hibernate本身提供了一級二級快取。這裡的快取獨立於應用,依然是記憶體的讀取,假如我們能減少資料庫頻繁的訪

問,那對系統肯定大大有利的。比如一個電子商務系統的商品搜尋,如果某個關鍵字的商品經常被搜,那就可以考慮這部分商品列表存放到快取(記憶體中

去),這樣不用每次訪問資料庫,效能大大增加。

簡單的快取大家可以理解為自己做一個hashmap,把常訪問的資料做一個key,value是第一次從資料庫搜尋出來的值,下次訪問就可以從map裡讀取,而不

讀資料庫;專業些的目前有獨立的快取框架比如memcached 等,可獨立部署成一個快取伺服器。

常見的提高高併發下訪問的效率的手段

      首先要了解高併發的的瓶頸在哪裡?

     1、可能是伺服器網路頻寬不夠

     2.可能web執行緒連線數不夠

     3.可能資料庫連線查詢上不去。

     根據不同的情況,解決思路也不同。

  1. 像第一種情況可以增加網路頻寬,DNS域名解析分發多臺伺服器。

  2. 負載均衡,前置代理伺服器nginx、apache等等

  3. 資料庫查詢優化,讀寫分離,分表等等

   最後複製一些在高併發下面需要常常需要處理的內容:

  • 儘量使用快取,包括使用者快取,資訊快取等,多花點記憶體來做快取,可以大量減少與資料庫的互動,提高效能。

  • 用jprofiler等工具找出效能瓶頸,減少額外的開銷。

  • 優化資料庫查詢語句,減少直接使用hibernate等工具的直接生成語句(僅耗時較長的查詢做優化)。

  • 優化資料庫結構,多做索引,提高查詢效率。

  • 統計的功能儘量做快取,或按每天一統計或定時統計相關報表,避免需要時進行統計的功能。

  • 能使用靜態頁面的地方儘量使用,減少容器的解析(儘量將動態內容生成靜態html來顯示)。

  • 解決以上問題後,使用伺服器叢集來解決單臺的瓶頸問題。

相關推薦

常見併發同步案例分析 併發處理策略

常見併發同步案例分析     案例一:訂票系統案例,某航班只有一張機票,假定有1w個人開啟你的網站來訂票,問你如何解決併發問題(可擴充套件到任何高併發網站要考慮                的併發讀寫問題)     問題,1w個人來訪問,票沒出去前要保證大家都能看到有

【轉載】併發解決:常見併發同步案例分析

案例一:訂票系統案例,某航班只有一張機票,假定有1w個人開啟你的網站來訂票,問你如何解決併發問題(可擴充套件到任何高併發網站要考慮               的併發讀寫問題)    問題,1w個人來訪問,票沒出去前要保證大家都能看到有票,不可能一個人在看到票的時候別人就不能

大資料之storm(一) --- storm簡介,核心元件,工作流程,安裝和部署,電話通訊案例分析,叢集執行,單詞統計案例分析,調整併發

一、storm簡介 --------------------------------------------------------- 1.開源,分散式,實時計算 2.實時可靠的處理無限資料流,可以使用任何語言開發 3.適用於實時分析,線上機器學習

futureTask設計、場景、併發下應用

參考文章 FutureTask的cancel方法真的能停止掉一個正在執行的非同步任務嗎 FutureTask的用法及兩種常用的使用場景 https://blog.csdn.net/linchunquan/article/details/22382487 i

JUC多執行緒併發

一、請你談談對volatile的理解 ​ Package java.util.concurrent---> A

JUC多執行緒併發面試題

JUC多執行緒及高併發 [TOC] 一、請你談談對volatile的理解 ​ Package java.util.concurre

談談Mysql主從同步延遲分析解決方案

一、MySQL的資料庫主從複製原理 MySQL主從複製實際上基於二進位制日誌,原理可以用一張圖來表示: 分為四步走: 1. 主庫對所有DDL和DML產生的日誌寫進binlog; 2. 主庫生成一個 log dump 執行緒,用來給從庫I/O執行緒讀取binlog;

慕課網-java併發秒殺api之併發優化-總結

1.架構優化 2.spring宣告式事務 宣告式事務:http://www.open-open.com/lib/view/open1414310646012.html 配置並使用Spring宣告式事務 在spring-service.xml中新增上配置事務管理器 <

JAVA併發(一)------瞭解併發

併發與並行的區別: 併發:兩個任務或者多個任務執行,多個任務交替執行 並行:兩個任務或者多個任務一起同時執行 例子:      一個CPU,去執行一個多執行緒任務。是不可能並行的,一個CPU只能執行一條命令,CPU會高速的切換執行緒任務去執行。這種情況下執行緒是併發的

matlab安裝軟體 Matlab視訊教程李大勇 MATLAB程式開發入門課程 MATLAB神經網路30個案例分析源程式

數學建模10大演算法詳解_程式原始碼打包 matlab安裝軟體  Matlab視訊教程李大勇 MATLAB程式開發入門課程 MATLAB神經網路30個案例分析及源程式 百度雲連結  http://download.csdn.net/download/wocao1226/10

ISO7816 ATR分析波特率設定

7816 ATR分析及高波特率設定: ATR組成參考下表, TS:參考上表 通常使用3B。 T0:格式字元 高四位(B8-B5)分別對應介面字元TD1-TA1是否存在,可根據需要進行設定,當相應的bit為1時需新增對應的字元。低四位(B4-B1)為表示歷史位元組的個數(範

Java併發秒殺API之併發優化(四)

四 高併發優化 1.分析 1.詳情頁 部署到cdn上,這樣使用者訪問的是cdn不是伺服器了。 使用者在上網時通過運營商訪問最近的都會網路,都會網路訪問主幹網。 2.獲取系統時間 不用優化 訪問一次記憶體大概 10ns 無法使用cdn,適合伺服

JAVA中的網路協議,UDP,TCP案例分析筆記總結

今日內容介紹 1、網路三要素及傳輸協議 2、實現UDP協議的傳送端和接收端 3、實現TCP協議的客戶端和伺服器 4、TCP上傳檔案案例 今日內容總結 5.1知識點總結 IP地址:用來唯一表示我們自己的電腦的,是一個網路標示 埠號: 用來區別當

MySQL資料庫主從同步延遲分析解決方案

一、MySQL的資料庫主從複製原理 1.主庫對所有DDL和DML產生的日誌寫進binlog; 2.主庫生成一個 log dump 執行緒,用來給從庫I/O執行緒讀取binlog; 3.從庫的I/O 

【佇列 併發】java web瞬間併發的解決方法

1、任何的高併發,請求總是會有一個順序的 2、java的佇列的資料結構是先進先出的取值順序 3、BlockingQueue類(執行緒安全)(使用方法可以百度) 一般使用LinkedBlockingQueue 利用以上幾點,我們可以把高併發時候的請求放入一個佇列,佇

金融類APP常見被拒絕原因分析解決

對於監管敏感的行業和應用,蘋果應用商店的稽核更為苛刻,接下來深圳APP開發公司【紅鳥網路】分析了金融類APP被AppStore稽核拒絕的常見願意以及解決方法。 我們首先要知道,蘋果稽核團隊(App Store Review)依據的稽核標準有2個,一個是《App Stor

錄影音視訊同步原理分析PTS計算公式

圖解分析音視訊同步要分別保證開始的PTS一樣,PTS是控制幀的顯示時間的,所以要實現音視訊同步必須分別設定音視訊的PTS。注:音、視訊最後一幀的PTS時刻不一定相同。1. 視訊時間戳計算pts = co

併發】Redis如何助力併發秒殺系統,看完這篇我徹底懂了!!

## 寫在前面 > 之前,我們在《[【高併發】高併發秒殺系統架構解密,不是所有的秒殺都是秒殺!](https://mp.weixin.qq.com/s?__biz=Mzg3MzE1NTIzNA==&mid=2247484357&idx=1&sn=23e6e38143704db0

常見網路攻擊方式介紹簡訊防攻擊策略的後端實現

大家好,今天給大家分享一下:幾種常見的網路攻擊方式的介紹以及簡訊防攻擊策略的後端實現。 一、背景介紹 有人的地方就有江湖,有資料互動的地方,就存在入侵風險。 只有知己知彼,才能百戰不殆。我們學習相關知識不是為了去攻擊別人的伺服器,只是為了防範於未然。 攻擊的種類多種多

Java Mysql連線池配置和案例分析--超時異常和處理

前言:   最近在開發服務的時候, 發現服務只要一段時間不用, 下次首次訪問總是失敗. 該問題影響雖不大, 但終究影響使用者體驗. 觀察日誌後發現, mysql連線因長時間空閒而被關閉, 使用時沒有死鏈檢測機制, 導致sql執行失敗.   問題的表層根源, 看似簡單, 但實際解決之路, 卻顯得有些曲折坎坷