最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java開發(fā)線上事故理解RocketMQ異步精髓

 更新時(shí)間:2022年07月18日 10:02:37   作者:勇哥java實(shí)戰(zhàn)分享  
這篇文章主要介紹了java開發(fā)線上事故理解RocketMQ異步精髓

引言

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

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

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

1 業(yè)務(wù)場景

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

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

  • 讀取課程視頻信息 :

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

  • 寫入課程觀看行為記錄 :

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

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

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

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

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

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

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

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

2 線程池模式

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

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

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

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

坦率的講,這是一個(gè)非常有效的方案,優(yōu)化后,紅包系統(tǒng)非常穩(wěn)定。

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

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

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

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

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

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

示例代碼如下:

我們可以借鑒開源中國的方案 :

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

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

4 MQ 模式

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

核心流程如下:

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

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

  • MQ 本身支持高可用和異步,發(fā)送消息效率高 , 也支持批量消費(fèi);
  • 消息在 MQ 服務(wù)端會持久化,可靠性要比保存在本地內(nèi)存高;

不過 MQ 模式需要引入新的組件,增加額外的復(fù)雜度。

5 Agent 服務(wù) + MQ 模式

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

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

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

還有一種演進(jìn),假設(shè)我們不想在應(yīng)用中依賴消息隊(duì)列,不生成本地文件,可以采用如下的方式:

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

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

6 總結(jié)

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

第一層:什么場景下需要異步

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

第二層:異步的外功心法

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

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

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

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

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

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

我們使用異步的解決方案時(shí),無論是使用線程池,還是本地內(nèi)存 + 定時(shí)任務(wù) ,亦或是 MQ ,對數(shù)據(jù)庫資源的使用都需要在合理的范圍內(nèi),只有這樣系統(tǒng)才能順暢的運(yùn)行。

以上就是java開發(fā)線上事故理解RocketMQ異步精髓的詳細(xì)內(nèi)容,更多關(guān)于java開發(fā)RocketMQ異步的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • drools的簡單入門案例場景分析

    drools的簡單入門案例場景分析

    drools是一款由JBoss組織提供的基于Java語言開發(fā)的開源規(guī)則引擎,可以將復(fù)雜且多變的業(yè)務(wù)規(guī)則從硬編碼中解放出來,這篇文章主要介紹了drools的簡單入門案例,需要的朋友可以參考下
    2022-05-05
  • Java中如何使用?byte?數(shù)組作為?Map?的?key

    Java中如何使用?byte?數(shù)組作為?Map?的?key

    本文將討論在使用HashMap時(shí),當(dāng)byte數(shù)組作為key時(shí)所遇到的問題及其解決方案,介紹使用String和List這兩種數(shù)據(jù)結(jié)構(gòu)作為臨時(shí)解決方案的方法,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • Java中LinkedHashSet、LinkedHashMap源碼詳解

    Java中LinkedHashSet、LinkedHashMap源碼詳解

    這篇文章主要介紹了Java中LinkedHashSet、LinkedHashMap源碼詳解,LinkedHashMap是一個(gè)以雙向鏈表的方式將Entry節(jié)點(diǎn)鏈接起來的HashMap子類,它在HashMap的基礎(chǔ)上實(shí)現(xiàn)了更多的功能,具有順序存儲和遍歷的特性,需要的朋友可以參考下
    2023-09-09
  • java并發(fā)學(xué)習(xí)-CountDownLatch實(shí)現(xiàn)原理全面講解

    java并發(fā)學(xué)習(xí)-CountDownLatch實(shí)現(xiàn)原理全面講解

    這篇文章主要介紹了java并發(fā)學(xué)習(xí)-CountDownLatch實(shí)現(xiàn)原理全面講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java中的String、StringBuilder、StringBuffer三者的區(qū)別詳解

    Java中的String、StringBuilder、StringBuffer三者的區(qū)別詳解

    這篇文章主要介紹了Java中的String、StringBuilder、StringBuffer三者的區(qū)別詳解,就是String,StringBuilder以及StringBuffer這三個(gè)類之間有什么區(qū)別呢,自己從網(wǎng)上搜索了一些資料,有所了解了之后在這里整理一下,便于大家觀看,需要的朋友可以參考下
    2023-12-12
  • Java14對于NullPointerException的新處理方式示例解析

    Java14對于NullPointerException的新處理方式示例解析

    這篇文章主要為大家介紹了Java14對于NullPointerException的新處理方式示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 詳解JAVA中priorityqueue的具體使用

    詳解JAVA中priorityqueue的具體使用

    這篇文章主要介紹了詳解JAVA中priorityqueue的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • JAVA?String常用方法超詳細(xì)講解

    JAVA?String常用方法超詳細(xì)講解

    String其實(shí)是Java庫中的一個(gè)預(yù)定義的類,String不是基本類型,而是引用類型,使用引用類型的變量稱為引用變量,它引用一個(gè)對象,下面這篇文章主要給大家介紹了關(guān)于JAVA?String常用方法的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • java后端操作樹結(jié)構(gòu)的案例代碼

    java后端操作樹結(jié)構(gòu)的案例代碼

    這篇文章主要介紹了java后端操作樹結(jié)構(gòu),樹結(jié)構(gòu)的三種組裝方式(遞歸.雙層for循環(huán),map),通過實(shí)例代碼介紹了使用遞歸查詢某個(gè)節(jié)點(diǎn)所在的樹結(jié)構(gòu),需要的朋友可以參考下
    2023-10-10
  • SpringBoot3整合pageHelper實(shí)現(xiàn)分頁功能

    SpringBoot3整合pageHelper實(shí)現(xiàn)分頁功能

    PageHelper是一個(gè)開源的Java分頁插件,它提供了方便的分頁查詢功能,適用于大多數(shù)基于Java的持久層框架(如MyBatis、Hibernate等),本文給大家介紹了springboot3整合pageHelper實(shí)現(xiàn)分頁功能的方法,需要的朋友可以參考下
    2024-08-08

最新評論

临泉县| 来凤县| 利辛县| 邵阳县| 赤水市| 桃江县| 同心县| 广宗县| 台湾省| 邻水| 越西县| 简阳市| 临颍县| 漳浦县| 公主岭市| 泰和县| 海兴县| 濮阳市| 腾冲县| 双辽市| 平昌县| 依安县| 若羌县| 昌宁县| 台东市| 镇远县| 大洼县| 北票市| 三门峡市| 句容市| 剑河县| 乌兰察布市| 彰化市| 洪江市| 陇川县| 涞源县| 铁岭县| 青田县| 宁津县| 渑池县| 调兵山市|