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

spring boot高并發(fā)下耗時(shí)操作的實(shí)現(xiàn)方法

 更新時(shí)間:2019年11月18日 08:31:09   作者:張占嶺  
這篇文章主要給大家介紹了關(guān)于spring boot高并發(fā)下耗時(shí)操作的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

高并發(fā)下的耗時(shí)操作

高并發(fā)下,就是請(qǐng)求在一個(gè)時(shí)間點(diǎn)比較多時(shí),很多寫的請(qǐng)求打過(guò)來(lái)時(shí),你的服務(wù)器承受很大的壓力,當(dāng)你的一個(gè)請(qǐng)求處理時(shí)間長(zhǎng)時(shí),這些請(qǐng)求將會(huì)把你的服務(wù)器線程耗盡,即你的主線程池里的線程將不會(huì)再有空閑狀態(tài)的,再打過(guò)來(lái)的請(qǐng)求,將會(huì)是502了。

請(qǐng)求流程圖

http1    http2        http3
thread1  thread2      thread3

解決方案

使用DeferredResult來(lái)實(shí)現(xiàn)異步的操作,當(dāng)一個(gè)請(qǐng)求打過(guò)來(lái)時(shí),先把它放到一個(gè)隊(duì)列時(shí),然后在后臺(tái)有一個(gè)訂閱者,有相關(guān)主題的消息發(fā)過(guò)來(lái)時(shí),這個(gè)訂閱者就去消費(fèi)它,這一步可以是分布式的,比如一個(gè)秒殺場(chǎng)景,當(dāng)N多的請(qǐng)求打過(guò)來(lái)時(shí),有一些請(qǐng)求命中后,它們進(jìn)行寫操作,這時(shí)寫操作壓力很大,1個(gè)請(qǐng)求可以要處理3秒,對(duì)于高并發(fā)場(chǎng)景這是不能容許的,因?yàn)槟氵@樣占用的服務(wù)器線程資源太長(zhǎng)了,很快你的服務(wù)器就沒有可用的線程資源了,這時(shí)就可以用到DeferredResult這處理。

代碼實(shí)現(xiàn)

建立訂單的接口,只負(fù)責(zé)簡(jiǎn)單的校驗(yàn)和事件的發(fā)布

  /**
   * 異步建立高并發(fā)的訂單.
   *
   * @return
   */
  @GetMapping("/create-order")
  public DeferredResult<Object> createOrder() {
    DeferredResult<Object> deferredResult = new DeferredResult<>((long) 3000, "error order");
    logger.info("發(fā)布建立訂單的事件");
    applicationEventPublisher.publishEvent(deferredResult);
    return deferredResult;
  }

異步的訂單處理核心邏輯,也是耗時(shí)的操作

@Component
@EnableAsync
public class OrderListener {

  static Logger logger = LoggerFactory.getLogger(OrderListener.class);

  /**
   * 事實(shí)上它是一個(gè)訂單隊(duì)列的消費(fèi)者,在后臺(tái)寫訂單,本例使用簡(jiǎn)單的事件監(jiān)聽器實(shí)現(xiàn)異步處理的功能.
   *
   * @return
   */
  @EventListener
  @Async
  public String processOrder(DeferredResult<Object> deferredResult) throws InterruptedException {
    logger.info("處理訂單并返回到對(duì)應(yīng)的Http上下文");
    String order = UUID.randomUUID().toString();
    Thread.sleep(2000);//假設(shè)處理數(shù)據(jù)需要5秒,前端需要阻塞5秒,但http主線程已經(jīng)釋放了,比較適合IO密集型場(chǎng)合
    //當(dāng)設(shè)置之后,create-order將成功響應(yīng)
    deferredResult.setResult(order);
    return order;
  }
}

測(cè)試結(jié)果

當(dāng)請(qǐng)求/create-order后,服務(wù)器在處理2秒后,返回結(jié)果,而spring后臺(tái)真正做的是,線程1在事件發(fā)布后,它成為空閑狀態(tài),其它請(qǐng)求可以復(fù)用它,當(dāng)processOrder后臺(tái)處理結(jié)果后,spring又會(huì)用線程池中拿一個(gè)新的線程處理剩下的邏輯!

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Java實(shí)現(xiàn)銀行存取款

    Java實(shí)現(xiàn)銀行存取款

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)銀行存取款,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • springboot項(xiàng)目如何設(shè)置時(shí)區(qū)

    springboot項(xiàng)目如何設(shè)置時(shí)區(qū)

    這篇文章主要介紹了springboot項(xiàng)目如何設(shè)置時(shí)區(qū)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java設(shè)計(jì)模式中的觀察者模式

    Java設(shè)計(jì)模式中的觀察者模式

    觀察者模式定義對(duì)象之間的一種一對(duì)多的依賴關(guān)系,使得每當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生變化時(shí),其相關(guān)的依賴對(duì)象都可以得到通知并被自動(dòng)更新。主要用于多個(gè)不同的對(duì)象對(duì)一個(gè)對(duì)象的某個(gè)方法會(huì)做出不同的反應(yīng)
    2023-02-02
  • springboot開啟Bean數(shù)據(jù)校驗(yàn)功能

    springboot開啟Bean數(shù)據(jù)校驗(yàn)功能

    這篇文章主要介紹了springboot開啟Bean數(shù)據(jù)校驗(yàn)功能,通過(guò)啟用Bean屬性校驗(yàn)導(dǎo)入JSR303與Hibernate校驗(yàn)框架坐標(biāo),使用@Validated注解啟用校驗(yàn)功能,需要的朋友可以參考下
    2023-10-10
  • Spring中Service注入多個(gè)實(shí)現(xiàn)類的方法詳解

    Spring中Service注入多個(gè)實(shí)現(xiàn)類的方法詳解

    這篇文章主要介紹了Spring中Service注入多個(gè)實(shí)現(xiàn)類的方法詳解,Spring是一個(gè)開源的Java框架,用于構(gòu)建企業(yè)級(jí)應(yīng)用程序,它提供了許多功能,如依賴注入、面向切面編程、數(shù)據(jù)訪問(wèn)、Web開發(fā)等,需要的朋友可以參考下
    2023-07-07
  • MyBatis快速入門

    MyBatis快速入門

    MyBatis是支持普通SQL查詢,存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。想要學(xué)好它,那就要從MyBatis基礎(chǔ)知識(shí)學(xué)起,下面跟著小編一起來(lái)看下吧
    2017-03-03
  • Java求字符串中出現(xiàn)次數(shù)最多的字符串以及出現(xiàn)次數(shù)

    Java求字符串中出現(xiàn)次數(shù)最多的字符串以及出現(xiàn)次數(shù)

    這篇文章主要為大家詳細(xì)介紹了Java統(tǒng)計(jì)字符串中出現(xiàn)次數(shù)最多的字符串以及出現(xiàn)次數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Java計(jì)算時(shí)間差和日期差五種常用示例

    Java計(jì)算時(shí)間差和日期差五種常用示例

    這篇文章主要給大家介紹了關(guān)于Java計(jì)算時(shí)間差和日期差五種常用示例的相關(guān)資料,最近工作中遇到需要計(jì)算時(shí)間差和日期差,搜索了幾種計(jì)算時(shí)間差和日期差的方法,這里總結(jié)一下,需要的朋友可以參考下
    2023-08-08
  • Spring Boot實(shí)現(xiàn)郵件發(fā)送必會(huì)的5種姿勢(shì)

    Spring Boot實(shí)現(xiàn)郵件發(fā)送必會(huì)的5種姿勢(shì)

    這篇文章主要給大家介紹了關(guān)于Spring Boot實(shí)現(xiàn)郵件發(fā)送必會(huì)的5種姿勢(shì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Java8 CompletableFuture詳解

    Java8 CompletableFuture詳解

    這篇文章主要介紹了Java8 CompletableFuture詳解,CompletableFuture extends Future提供了方法,一元操作符和促進(jìn)異步性以及事件驅(qū)動(dòng)編程模型,需要的朋友可以參考下
    2014-06-06

最新評(píng)論

酉阳| 甘洛县| 天柱县| 洪洞县| 磐安县| 景宁| 五台县| 旅游| 明溪县| 万年县| 怀柔区| 招远市| 西城区| 姜堰市| 宾川县| 乌海市| 阿拉善右旗| 宜丰县| 盐边县| 开封市| 滕州市| 闽清县| 哈尔滨市| 南木林县| 吉水县| 南昌县| 济南市| 凯里市| 五大连池市| 建昌县| 丹寨县| 中阳县| 中山市| 临潭县| 万盛区| 新民市| 柘城县| 榆社县| 年辖:市辖区| 辽源市| 佛冈县|