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

Java請求流量合并和拆分提高系統(tǒng)的并發(fā)量示例

 更新時間:2022年04月02日 16:00:25   作者:Java知識圖譜  
這篇文章主要為大家介紹了Java請求流量合并和拆分提高系統(tǒng)的并發(fā)量示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪

序言

在并發(fā)場景中,當(dāng)熱點緩存Key失效時,流量瞬間打到數(shù)據(jù)庫中,此所謂緩存擊穿現(xiàn)象;當(dāng)大范圍的緩存Key失效時,流量也會打到數(shù)據(jù)庫中,此所謂緩存雪崩現(xiàn)象。

當(dāng)使用分布式行鎖時,能夠有效解決緩存擊穿問題;當(dāng)使用分布式表鎖時,能夠解決緩存雪崩問題。實際操作中,分布式表鎖不在考慮范圍,理由是降低并發(fā)量。

本文將從另一個角度出發(fā),將請求流量合并和拆分,以提高系統(tǒng)的并發(fā)量。

理論基礎(chǔ)

流量的合并與拆分原理是將多條請求合并成一條請求,執(zhí)行后再將結(jié)果拆分。在數(shù)據(jù)庫與緩存架構(gòu)中,緩存Key失效的瞬間,大量重復(fù)請求打到數(shù)據(jù)庫中。實際上除了第一條請求為有效請求,隨后的請求為無效請求,浪費數(shù)據(jù)庫連接資源。

流量的合并與拆分實踐是額外喚醒一個線程,每隔固定時間(比如200毫秒)發(fā)送合并后的請求,執(zhí)行完成后將查詢結(jié)果進(jìn)行拆分,分發(fā)到原始請求中,原始請求響應(yīng)用戶請求。

從應(yīng)用到數(shù)據(jù)庫之間連接資源需求顯著下降,從而提高數(shù)據(jù)庫連接資源利用率。

應(yīng)用實踐

(一)編碼與使用

基于MybatisPlus提供一個內(nèi)置封裝的服務(wù)類QueueServiceImpl,透明的實現(xiàn)查詢詳情流量的合并與拆分,使用者可屏蔽內(nèi)部實現(xiàn)。

<dependency>
    <groupId>xin.altitude.cms</groupId>
    <artifactId>ucode-cms-common</artifactId>
    <version>1.4.4</version>
</dependency>

對于一定時間區(qū)間內(nèi)的所有請求,合并成一條請求處理。

@Override
public BuOrder getOrderById(Long orderId) {
    return getById(orderId);
}

舉例說明,如果特定時間區(qū)間內(nèi)匯集了相同的主鍵請求,那么合并后的請求查詢一次數(shù)據(jù)庫便能夠響應(yīng)所有的請求。

子類重寫父類方法,可修改合并與拆分的行為。

@Override
protected RequstConfig createRequstConfig() {
    RequstConfig config = new RequstConfig();
    /* 單次最大合并請求數(shù)量 */
    config.setMaxRequestSize(100);
    /* 核心線程池大小 */
    config.setCorePoolSize(1);
    /* 請求間隔(毫秒) */
    config.setRequestInterval(200);
    return config;
}

實現(xiàn)細(xì)節(jié)

1、ConcurrentLinkedQueue

使用ConcurrentLinkedQueue并發(fā)安全隊列用于緩沖和接收請求,定時任務(wù)以固定頻率從隊列中消費數(shù)據(jù),將多條請求條件合并后匯總查詢。

2、CompletableFuture

CompletableFuture類是合并與拆分的關(guān)鍵類,原始請求將查詢條件封裝成CompletableFuture對象,提交到隊列中后陷入阻塞,定時任務(wù)分批次組裝查詢條件,得到結(jié)果后將結(jié)果拆分并存入CompletableFuture對象中,原始請求線程被喚醒,繼續(xù)響應(yīng)用戶請求。

其它應(yīng)用場景

應(yīng)用于數(shù)據(jù)庫間流量的合并請求與拆分,首先提高數(shù)據(jù)庫連接資源(稀缺資源)利用率,其次提高網(wǎng)絡(luò)間數(shù)據(jù)傳輸效率。100條數(shù)據(jù)收發(fā)100次與100條數(shù)據(jù)收發(fā)一次的效率差別。

1、服務(wù)間接口調(diào)用

服務(wù)間API接口調(diào)用同樣適用于流量的合并與拆分:比如向訂單服務(wù)發(fā)送Http API請求,同一時刻有100個用戶發(fā)起查詢請求,使用流量合并與拆分的思想可將多個訂單查詢請求轉(zhuǎn)換成批查詢請求,得到結(jié)果后分發(fā)到不同的請求線程,響應(yīng)用戶請求。

小結(jié)

在本文中,選用的隊列是本地并發(fā)安全的隊列,在分布式系統(tǒng)中,本地隊列是否合適?此處選用本地隊列基于兩點考慮:一是無嚴(yán)格的分布式的需求;二是CompletableFuture類不支持序列化??紤]使用Redis做分布式隊列的想法無法實現(xiàn),你用本地隊列,盡管會有少量查詢條件數(shù)據(jù)冗余(不影響結(jié)果),回避了分布式隊列的網(wǎng)絡(luò)IO延遲,反而有更優(yōu)的查詢效率。

本方案僅在高并發(fā)場景受益,屬于針對并發(fā)場景進(jìn)行架構(gòu)的優(yōu)化,普通項目使用常規(guī)操作即可。

以上就是Java請求流量合并和拆分提高系統(tǒng)的并發(fā)量示例的詳細(xì)內(nèi)容,更多關(guān)于Java流量合并拆分提高系統(tǒng)的并發(fā)量的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 新手學(xué)習(xí)Java對Redis簡單操作

    新手學(xué)習(xí)Java對Redis簡單操作

    這篇文章主要介紹了新手學(xué)習(xí)Java對Redis簡單操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Spring @Bean注解的使用場景與案例實現(xiàn)

    Spring @Bean注解的使用場景與案例實現(xiàn)

    隨著SpringBoot的流行,我們現(xiàn)在更多采用基于注解式的配置從而替換掉了基于XML的配置,所以本篇文章我們主要探討基于注解的@Bean以及和其他注解的使用
    2023-03-03
  • Spring集成Seata方式(案例演示)

    Spring集成Seata方式(案例演示)

    這篇文章主要介紹了Spring集成Seata方式,本案例使用Seata-All演示,結(jié)合實例代碼給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • 關(guān)于SpringCloudStream配置問題

    關(guān)于SpringCloudStream配置問題

    這篇文章主要介紹了關(guān)于SpringCloudStream配置問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java利用反射實現(xiàn)文件的讀取操作

    Java利用反射實現(xiàn)文件的讀取操作

    這篇文章主要介紹了Java利用反射實現(xiàn)文件的讀取操作,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Java 如何解析key為動態(tài)的json操作

    Java 如何解析key為動態(tài)的json操作

    這篇文章主要介紹了Java 如何解析key為動態(tài)的json操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 詳解Java中日期工具類的操作

    詳解Java中日期工具類的操作

    這篇文章主要為大家詳細(xì)介紹了Java中日期工具類的常見操作,如:字符串和Date互轉(zhuǎn)、字符串和LocalDate互轉(zhuǎn)等,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-11-11
  • 使用Java編寫圖形化的菜單的教程

    使用Java編寫圖形化的菜單的教程

    這篇文章主要介紹了使用Java編寫圖形化的菜單的教程,需要的朋友可以參考下
    2015-10-10
  • java實現(xiàn)jdbc查詢結(jié)果集result轉(zhuǎn)換成對應(yīng)list集合

    java實現(xiàn)jdbc查詢結(jié)果集result轉(zhuǎn)換成對應(yīng)list集合

    本文給大家匯總介紹了java實現(xiàn)jdbc查詢結(jié)果集result轉(zhuǎn)換成對應(yīng)list集合,十分的簡單,有相同需求的小伙伴可以參考下。
    2015-12-12
  • Spring Boot應(yīng)用上傳文件時報錯的原因及解決方案

    Spring Boot應(yīng)用上傳文件時報錯的原因及解決方案

    這篇文章主要介紹了Spring Boot應(yīng)用上傳文件時報錯的原因及解決方案,幫助大家更好的理解和學(xué)習(xí)使用spring boot框架,感興趣的朋友可以了解下
    2021-02-02

最新評論

阜新市| 厦门市| 扬中市| 陆丰市| 平江县| 通州市| 凤冈县| 即墨市| 锦州市| 五家渠市| 苏尼特左旗| 治县。| 池州市| 阿克苏市| 平武县| 噶尔县| 蛟河市| 临安市| 水富县| 体育| 德兴市| 青海省| 岱山县| 翁源县| 藁城市| 岢岚县| 抚远县| 肇源县| 东台市| 海阳市| 额尔古纳市| 西林县| 寻乌县| 翼城县| 余姚市| 历史| 富宁县| 苗栗县| 延长县| 惠水县| 溆浦县|