成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一次線上高并發(fā)事故,我頓悟了異步的精髓……

開發(fā) 新聞
寫這篇文章,筆者想和大家深入探討該場(chǎng)景的架構(gòu)優(yōu)化方案。

在高并發(fā)的場(chǎng)景下,異步是一個(gè)極其重要的優(yōu)化方向。

前段時(shí)間,生產(chǎn)環(huán)境發(fā)生一次事故,筆者認(rèn)為事故的場(chǎng)景非常具備典型性。

寫這篇文章,筆者想和大家深入探討該場(chǎng)景的架構(gòu)優(yōu)化方案。希望大家讀完之后,可以對(duì)異步有更深刻的理解。

一、業(yè)務(wù)場(chǎng)景

老師登錄教研平臺(tái),會(huì)看到課程列表,點(diǎn)擊課程后,課程會(huì)以視頻的形式展現(xiàn)出來(lái)。


圖片

訪問課程詳情頁(yè)面,包含兩個(gè)核心動(dòng)作:

  • 讀取課程視頻信息 

從緩存服務(wù)器 Redis 獲取課程的視頻信息 ,返回給前端,前端通過視頻組件渲染。

  • 寫入課程觀看行為記錄 

當(dāng)教師觀看視頻的過程中,瀏覽器每隔3秒發(fā)起請(qǐng)求,教研服務(wù)將觀看行為記錄插入到數(shù)據(jù)庫(kù)表中。而且隨著用戶在線人數(shù)越多,寫操作的頻率也會(huì)指數(shù)級(jí)增長(zhǎng)。

上線初期,這種設(shè)計(jì)運(yùn)行還算良好,但隨著在線用戶的增多,系統(tǒng)響應(yīng)越來(lái)越慢,大量線程阻塞在寫入視頻觀看進(jìn)度表上的 Dao 方法上。

首先我們會(huì)想到一個(gè)非常直觀的方案,提升寫入數(shù)據(jù)庫(kù)的能力。

  • 優(yōu)化 SQL 語(yǔ)句;
  • 提升 MySQL 數(shù)據(jù)庫(kù)硬件配置 ;
  • 分庫(kù)分表。

這種方案其實(shí)也可以滿足我們的需求,但是通過擴(kuò)容硬件并不便宜,另外寫操作可以允許適當(dāng)延遲和丟失少量數(shù)據(jù),那這種方案更顯得性價(jià)比不足。

那么架構(gòu)優(yōu)化的方向應(yīng)該是:“減少寫動(dòng)作的耗時(shí),提升寫動(dòng)作的并發(fā)度”, 只有這樣才能讓系統(tǒng)更順暢的運(yùn)行。

于是,我們想到了第二種方案:寫請(qǐng)求異步化。

  • 線程池模式
  • 本地內(nèi)存 + 定時(shí)任務(wù)
  • MQ 模式
  • Agent 服務(wù) + MQ 模式

二、線程池模式

2014年,筆者在藝龍旅行網(wǎng)負(fù)責(zé)紅包系統(tǒng)相關(guān)工作。運(yùn)營(yíng)系統(tǒng)會(huì)調(diào)用紅包系統(tǒng)給特定用戶發(fā)送紅包,當(dāng)這些用戶登錄 app 后,app 端會(huì)調(diào)用紅包系統(tǒng)的激活紅包接口 。

激活紅包接口是一個(gè)寫操作,速度也比較快(20毫秒左右),接口的日請(qǐng)求量在2000萬(wàn)左右。

應(yīng)用訪問高峰期,紅包系統(tǒng)會(huì)變得不穩(wěn)定,激活接口經(jīng)常超時(shí),筆者為了快速解決問題,采取了一個(gè)非常粗糙的方案:

"控制器收到請(qǐng)求后,將寫操作放入到獨(dú)立的線程池中后,立即返回給前端,而線程池會(huì)異步執(zhí)行激活紅包方法"。

當(dāng)時(shí)按照這種粗糙的方法優(yōu)化后,紅包系統(tǒng)非常穩(wěn)定,再也沒有出現(xiàn)接口響應(yīng)超時(shí)的問題。

回到教研的場(chǎng)景,見下圖,我們也可以設(shè)計(jì)類似線程池模型的方案:

圖片

使用線程池模式,需要注意如下幾點(diǎn):

  • 線程數(shù)不宜過高,避免占用過多的數(shù)據(jù)庫(kù)連接 ;
  • 需要考慮評(píng)估線程池隊(duì)列的大小,以免出現(xiàn)內(nèi)存溢出的問題。

三、本地內(nèi)存 + 定時(shí)任務(wù)

開源中國(guó)統(tǒng)計(jì)瀏覽數(shù)的方案非常經(jīng)典。

用戶訪問過一次文章、新聞、代碼詳情頁(yè)面,訪問次數(shù)字段加 1 , 在 oschina 上這個(gè)操作是異步的,訪問的時(shí)候只是將數(shù)據(jù)在內(nèi)存中保存,每隔固定時(shí)間將這些數(shù)據(jù)寫入數(shù)據(jù)庫(kù)。

圖片

示例代碼如下:

圖片

我們可以借鑒開源中國(guó)的方案 :

  • 控制器接收請(qǐng)求后,觀看進(jìn)度信息存儲(chǔ)到本地內(nèi)存 LinkedBlockingQueue 對(duì)象里;
  • 異步線程每隔1分鐘從隊(duì)列里獲取數(shù)據(jù) ,組裝成 List 對(duì)象,最后調(diào)用 Jdbc batchUpdate 方法批量寫入數(shù)據(jù)庫(kù);
  • 批量寫入主要是為了提升系統(tǒng)的整體吞吐量,每次批量寫入的 List 大小也不宜過大 。

這種方案優(yōu)點(diǎn)是:不改動(dòng)原有業(yè)務(wù)架構(gòu),簡(jiǎn)單易用,性能也高。該方案同樣需要考慮內(nèi)存溢出的風(fēng)險(xiǎn)。

四、MQ 模式

很多同學(xué)們會(huì)想到 MQ 模式 ,消息隊(duì)列最核心的功能是異步解耦,MQ 模式架構(gòu)清晰,易于擴(kuò)展。

圖片

核心流程如下:

  • 控制器接收寫請(qǐng)求,將觀看視頻行為記錄轉(zhuǎn)換成消息 ;
  • 教研服務(wù)發(fā)送消息到 MQ  ,將寫操作成功信息返回給前端 ;
  • 消費(fèi)者服務(wù)從 MQ 中獲取消息 ,批量操作數(shù)據(jù)庫(kù) 。

這種方案優(yōu)點(diǎn)是:

  • MQ 本身支持高可用和異步,發(fā)送消息效率高 , 也支持批量消費(fèi);
  • 消息在 MQ 服務(wù)端會(huì)持久化,可靠性要比保存在本地內(nèi)存高;
  • 不過 MQ 模式需要引入新的組件,增加額外的復(fù)雜度。

五、Agent 服務(wù) + MQ 模式

互聯(lián)網(wǎng)大廠還有一種常見的異步的方案:Agent 服務(wù) + MQ 模式。

圖片

教研服務(wù)器上部署 Agent 服務(wù)(獨(dú)立的進(jìn)程) , 教研服務(wù)接收寫請(qǐng)求后,將請(qǐng)求按照固定的格式(比如 JSON )寫入到磁盤中,然后給前端返回成功信息。

Agent 服務(wù)會(huì)監(jiān)聽文件變動(dòng),將文件內(nèi)容發(fā)送到消息隊(duì)列 , 消費(fèi)者服務(wù)獲取觀看行為記錄,將其存儲(chǔ)到 MySQL 數(shù)據(jù)庫(kù)中。

這種方案最大的優(yōu)點(diǎn)是:架構(gòu)分層清晰,業(yè)務(wù)服務(wù)不需要引入 MQ 組件。

筆者原來(lái)接觸過的性能監(jiān)控平臺(tái),或者日志分析平臺(tái)都使用這種模式。

六、總結(jié)

學(xué)習(xí)需要一層一層遞進(jìn)的思考。

第一層:什么場(chǎng)景下需要異步

  • 大量寫操作占用了過多的資源,影響了系統(tǒng)的正常運(yùn)行;
  • 寫操作異步后,不影響主流程,允許適當(dāng)延遲。

第二層:異步的外功心法

本文提到了四種異步方式:

  • 線程池模式
  • 本地內(nèi)存 + 定時(shí)任務(wù)
  • MQ 模式
  • Agent 服務(wù) + MQ 模式

它們的共同特點(diǎn)是:將寫操作命令存儲(chǔ)在一個(gè)池子后,立刻響應(yīng)給前端,減少寫動(dòng)作的耗時(shí)。任務(wù)服務(wù)異步從池子里獲取任務(wù)后執(zhí)行。

第三層:異步的本質(zhì)

在筆者看來(lái),異步是更細(xì)粒度的使用系統(tǒng)資源的一種方式。

在教研課程詳情場(chǎng)景里,數(shù)據(jù)庫(kù)的資源是固定的,但寫操作占據(jù)大量數(shù)據(jù)庫(kù)資源,導(dǎo)致整個(gè)系統(tǒng)的阻塞,但寫操作并不是最核心的業(yè)務(wù)流程,它不應(yīng)該占用那么多的系統(tǒng)資源。

不能為了異步而異步,無(wú)論是使用線程池,還是本地內(nèi)存 + 定時(shí)任務(wù) ,亦或是 MQ ,對(duì)數(shù)據(jù)庫(kù)資源的使用都需要在合理的范圍內(nèi),否則異步就達(dá)不到我們想要的效果。

責(zé)任編輯:張燕妮 來(lái)源: 勇哥java實(shí)戰(zhàn)分享
相關(guān)推薦

2022-07-11 13:58:14

數(shù)據(jù)庫(kù)業(yè)務(wù)流程系統(tǒng)

2023-01-16 14:49:00

MongoDB數(shù)據(jù)庫(kù)

2022-06-06 11:31:31

MySQL數(shù)據(jù)查詢

2020-11-16 12:35:25

線程池Java代碼

2025-03-11 08:48:35

JVMOOM事故

2020-10-21 12:10:30

訂單號(hào)Java代碼

2020-08-20 07:37:21

數(shù)據(jù)庫(kù)開源框架

2020-08-28 08:55:32

商城系統(tǒng)高并發(fā)

2022-06-30 19:00:00

高可用KeepalivedLinux

2020-08-24 07:34:39

網(wǎng)絡(luò)超時(shí)請(qǐng)求

2021-03-05 22:41:55

CDH集群CDH集群

2022-05-12 09:52:09

網(wǎng)絡(luò)架構(gòu)HTTP跨域保護(hù)機(jī)制

2020-09-22 08:06:45

代碼事故

2019-01-16 09:20:42

架構(gòu)設(shè)計(jì)JVM FullGC宕機(jī)事故

2022-09-13 09:50:08

分頁(yè)慢查詢

2024-06-04 08:19:34

2023-01-04 18:32:31

線上服務(wù)代碼

2023-12-08 08:23:55

算法題dfs算法二叉樹

2022-03-31 09:00:47

高并發(fā)Log4j2java

2017-11-09 09:06:29

流量暴增優(yōu)化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产在线a | 国产在线不卡 | av网站免费观看 | 久久久精品 | 国产美女在线观看 | 亚洲电影成人 | 亚洲久草| 中文字幕加勒比 | 精品久久一 | 日韩一二三区视频 | 九色视频网 | 国产高潮好爽受不了了夜夜做 | 在线成人av | 欧美αv| 日本免费一区二区三区四区 | 久久国产高清 | 亚洲欧美国产一区二区三区 | 婷婷综合 | 国产午夜精品一区二区 | 国产成人jvid在线播放 | 亚洲一区不卡 | 久久久噜噜噜久久中文字幕色伊伊 | 黄色中文字幕 | 国精品一区二区 | 久久综合伊人一区二区三 | 中文字幕色站 | 午夜精品视频在线观看 | 精品久久一区二区三区 | 日本精品视频一区二区 | 中文字幕在线一区 | 拍真实国产伦偷精品 | 精品一二 | 国产精品久久久久久久久久软件 | 超黄视频网站 | 国产精品视频一区二区三区 | 国产在视频一区二区三区吞精 | 国产在线一级片 | 国产精品一区二区三区久久久 | 国产精品99久久久久久www | 久草99 | 一区二区三区回区在观看免费视频 |