色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

案例參考:一個Java高并發異步應用

如意 ? 來源:CSDN ? 作者:finethere ? 2020-06-20 09:16 ? 次閱讀

在日常運營中,公眾號會通過給用戶下發營銷或者科普類的消息來通知客戶。 根據經驗,微信消息下發后10分鐘后流量會逐步上升,30分鐘左右到達峰值,1個小時后會顯著下降。在這個時間段內,系統的壓力會很大。

在系統設計和改進中,系統的很多場景使用異步進行實現,一方面能縮短主流程的時間處理,另一方面能夠通過異步隊列進行一定程度的削峰。今天重點介紹單個JVM內的異步優化實踐,不涉及分布式時的異步優化實踐。在異步執行時,可以調用遠程的服務集群來實現一定的任務分解。

部署示意圖

案例參考:一個Java高并發異步應用

整個系統都部署在公有云上,虛擬機上有部署1個Nginx,4個Tomcat,Nginx使用隨機的方式負載均衡到Tomcat上面。虛機之間通過LB將客戶請求轉發到Nginx上面負載均衡,Nginx再將請求分配到tomcat應用服務器上。

由多臺應用服務器,對外服務提供Rest服務,在每個Tomcat內部使用異步隊列。同時由一臺控制服務器,進行異步任務的補償任務和管理功能。Tomcat和Redis使用多級緩存來降低對Redis的壓力,并減少依賴。

為什么要在虛機上部署Nginx將請求轉發到Tomcat,而不是由LB直接轉發到Tomcat。這是因為LB能夠支持的IP個數是有限的。

典型的用戶場景

在公眾號的運營過程中,典型的事件包括:

發送短信驗證碼

購買成功或者抽獎成功短信通知

卡券或優惠券發放

發放微信紅包

微信消息通知

訂單流程處理

定時批處理(比如數據同步)

工作流性質的異步任務(未完成異步任務補償)

面詳細說明不同場景能夠異步的原因:

不同場景(用戶注冊,用戶購買產品等)下的短信驗證碼發送,可以使用異步方式發送: 一方面是因為客戶這個時效性要求沒有那樣高,另一方面在特定時間范圍內用戶沒有收到驗證碼,用戶可以點擊再次發送驗證碼。

購買成功或者抽獎成功后短信或者郵件通知,可以通過異步的方式進行。 因為涉及用戶的利益,要謹慎對待。一方面一定要把數據先存到數據庫或者日志里面(注意信息安全^-^,別存敏感明文信息或者加密存儲),然后再放入到異步隊列中執行。

另一個方面,要考慮到應用服務意外停止時,沒有發送成功數據的補償機制。 這種情況不常見,并且為了減少耦合和當前異步程序的復雜度。我們使用單獨的服務上部署異步任務補償程序,來掃描未完成的任務,并且進行重放(一定要注意嚴謹性)。

優惠券和卡券的發放,跟購買成功或抽獎成功的方式類似。\u000b可以在當前活動高峰后延時發放,并且使用異步的方式進行。

微信紅包,因為需要跟微信進行交互,并且微信會通知客戶紅包的情況,可以使用異步的方式進行。 當涉及資金或者禮品時,一定要謹慎對待設計,并且需要有方便進行異步任務停止和啟動的功能。

微信消息通知,因為跟微信進行交互,成功后微信進行通知,可以使用異步。 這個跟短信驗證碼類似。

訂單流程處理,可以使用異步,因為涉及到后續步驟可以使用簡單工作流來完成。有幾個開源的框架可以參考。

數據同步或者異步任務補償,因為是延時處理,可以使用異步進行處理。在使用時,可以配合定時任務,比如cron4j來周期性的進行補償。適合后面總-分-總的任務處理模式。

針對這些“無處不在的異步”,后面詳細分析其內在模型。

無處不在的異步

下圖包含了4種典型的異步隊列模型(圖片來源于網絡):

案例參考:一個Java高并發異步應用

一個生產者生產數據,一個消費者消費數據,一般用在后臺處理的業務邏輯中。

一個生產者生產數據,多個消費者消費數據(這里面有兩種情況:同一個消息,可以被多個消費者分別消費。或者多個消費者組成一個組,一個消費者消費一個數據)。

多個生產者生產數據,單個消費者消費數據,可以用在限流或者排隊等候單一資源處理的場景中。

多個生產者分別生產數據,多個消費者消費數據(這里面有兩種情況:同一個消息,可以被多個消費者分別消費。或者多個消費者組成一個組,一個消費者消費一個數據)。

案例參考:一個Java高并發異步應用

總分總任務模型:特別適第一個線程取出一批數據放到隊列中(比如select);由多個線程分別執行業務邏輯;執行后的結果由一個線程來執行(比如update操作,這樣能夠防止數據庫鎖)

這是從技術上分析的幾種常見模型,在實踐中涉及怎樣選擇框架。

使用堵塞隊列的線程池

使用固定步長或固定時間的隊列

使用Disruptor

使用MQ或Kafka

使用線程池實現異步 (支持多生產者,多消費者)

案例參考:一個Java高并發異步應用

特點:可以使用JDK自帶的線程池實現異步,編程簡單,資料多。建議在并發量小的場景下優先選擇。

使用Guava Queues (支持多生產者單消費者)

案例參考:一個Java高并發異步應用

特點:異步批量隊列,在隊列到達指定長度,或者到達指定時間后,批量進行數據處理。適合于對響應時間要求低,能夠容忍一定的數據丟失的場景。比如短小文本數據的批量保存。

在經過一段時間調研后,我們發現Disruptor更能滿足我們需要。

首先介紹一下Disruptor的強悍的性能。

案例參考:一個Java高并發異步應用

這張圖包含我列舉的上述的異步隊列模型景,因此很有代表意義。Disruptor因為使用無鎖的隊列方式,具有很高的性能。具體的原理不詳述,大家可以搜索看到。Disruptor支持上面典型場景,并且靈活使用Disruptor的工作流機制,能簡化編程。

再貼一下官方的測試結果。

案例參考:一個Java高并發異步應用

使用異步后的煩惱

煩惱一: 數據丟失的風險

解決方式:先寫日志或數據庫,后放入異步隊列。

煩惱二:對其他系統的壓力變大

解決方式:使用一定的限流和熔斷,對其他系統進行保護。

煩惱三:數據保存后異步任務未執行

解決方式:使用異步任務補償的方式,定期從數據庫中獲取數據,放到隊列中進行執行,執行后更新數據狀態位。

煩惱四:怎樣隊列長設置和消費者數量

解決方式:使用實際的壓力測試來獲得隊列長度。或者使用排隊論的數學公式得到初步的值,然后進行實際壓測。

最后介紹一下項目中的經驗:

量力而行:根據業務特點進行技術選型,業務量小盡量避免使用異步。有所為,有所不為

數據說話:異步時一定要進行必要的壓力測試

先找出系統的關鍵點:優化單體系統內的性能,再通過整體系統分解來全局優化

根據團隊和項目的特點選擇框架。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2973

    瀏覽量

    104939
  • 異步
    +關注

    關注

    0

    文章

    62

    瀏覽量

    18076
收藏 人收藏

    評論

    相關推薦

    HarmonyOS如何使用異步并發能力進行開發

    并發概述 并發是指在同時間段內,能夠處理多個任務的能力。為了提升應用的響應速度與幀率,以及防止耗時任務對主線程的干擾,HarmonyOS系統提供了
    的頭像 發表于 02-18 09:18 ?565次閱讀

    從服務端視角看并發難題

    `所謂服務器大流量并發指的是:在同時或極短時間內,有大量的請求到達服務端,每個請求都需要服務端耗費資源進行處理,并做出相應的反饋。 從服務端視角看并發服務端處理請求需要耗費服務端的
    發表于 11-02 15:11

    java異步回調和同步回調

    java異步回調和同步回調 最近,在準備有關Java并行流的討論時,我注意到經典文章“ 免費午餐結束 ”(TFLiO)已經過了十歲生日。 對于大多數程序員而言,本文及其伴隨的宣傳是他們的第一個
    發表于 07-28 08:36

    詳細介紹了Java泛型、注解、并發編程

    介紹了Java泛型、注解、并發編程、數據傳輸與序列化、高效IO、容器集合、反射與類加載以及JVM重點知識線程、內存模型、JVM運行時內存、垃圾回收與算法、Java中四種引用類型、GC 分代收集算法
    發表于 08-20 06:09

    如何去實現種基于SpringMVC的電商并發秒殺系統設計

    參考博客Java并發秒殺系統API目錄業務場景要解決的問題Redis的使用業務場景首頁倒計時秒殺活動,搶購商品要解決的問題并發下庫存的控
    發表于 01-03 07:50

    HarmonyOS如何使用異步并發能力進行開發

    并發概述 并發是指在同時間段內,能夠處理多個任務的能力。為了提升應用的響應速度與幀率,以及防止耗時任務對主線程的干擾,HarmonyOS系統提供了
    發表于 09-22 17:35

    Java并發程序設計教程

    Java并發程序設計教程
    發表于 03-19 11:23 ?2次下載

    Java并發編程實戰

    Java并發編程實戰
    發表于 03-19 11:24 ?7次下載

    java之volatile并發

    。內存模型的相關概念 二。并發編程中的三概念 三.Java內存模型 四。.深入剖析volatile關鍵字 五。使用volatile關鍵字的場景 若有不正之處請多多諒解,并歡迎批評指
    發表于 09-27 10:20 ?6次下載
    <b class='flag-5'>java</b>之volatile<b class='flag-5'>并發</b>

    詳解java并發機制

    般性開發中,筆者經常看到很多同學在對待java并發開發模型中只會使用些基礎的方法。比如Volatile,synchronized。像Lock和atomic這類高級
    發表于 09-27 14:31 ?0次下載

    java并發編程實戰之輔助類用法

    Java并發編程:CountDownLatch、CyclicBarrier和Semaphore2017-09-18 13:07程序設計/58 在java 1.5中,提供了些非常有用的
    發表于 09-27 16:50 ?0次下載

    JAVA并發編程實踐

    JAVA并發編程實踐資料免費下載。
    發表于 06-01 15:31 ?15次下載

    Java并發編程的藝術

    Java并發編程的藝術說明。
    發表于 06-01 15:31 ?16次下載

    并發、輕量級的信息泄露掃描工具BBScan

    BBScan 是并發、輕量級的信息泄露掃描工具。
    的頭像 發表于 09-21 10:19 ?1676次閱讀

    java redis鎖處理并發代碼

    并發編程中,常見的問題是如何確保多個線程安全地訪問共享資源,避免產生競態條件和數據異常。而Redis作為種高性能的內存數據庫,可以提供分布式鎖的功能,通過Redis鎖,我們可以
    的頭像 發表于 12-04 11:04 ?973次閱讀
    主站蜘蛛池模板: 日本久久不射| 国产亚洲精品AV麻豆狂野| s8sp视频高清在线播放| 国产人妻XXXX精品HD电影| 两性午夜色视频免费网站| 88福利视频| 国产普通话精品久久| 嫩草影院在线观看精品| 亚洲XXX午休国产熟女屁| 99久久精品免费看国产一区二区三区| 国产精品爽爽久久久久久蜜桃| 欧美日韩精品不卡在线观看| 野花香在线观看免费观看大全动漫| 伧理片午夜伧理片| 快播电影网址| 一色屋精品亚洲香蕉网站| 国产精品视频免费视频| 欧洲美女高清一级毛片| 18videosex性欧美黑色| 在线观看成年人免费视频| 国产成人免费不卡在线观看| 欧美黄色精品| 做暧暧免费30秒体验| 精品人妻无码一区二区三区蜜桃臀| 视频成人app永久在线观看| 99热都是精品| 欧美97色伦影院在线观看| 日韩中文欧美在线视频| 97国产精品人妻无码免费| 久久久国产精品免费A片蜜臀| 亚洲国产日韩a精品乱码| 3acg同人漫画禁图h| 办公室沙发口爆12P| 暖暖 免费 日本 高清 在线1| 伊人久久大香线蕉观看| 久久re视频这里精品免费1| 欧美hdxxxx| 99久久久无码国产精品AAA| 久久精品热老司机| 孕妇bbwbbwbbwbbw超清| 老师的丝袜脚|