欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JAVA下單接口優(yōu)化實戰(zhàn)TPS性能提高10倍

 更新時間:2018年12月06日 15:10:07   作者:Sam哥哥  
今天小編就為大家分享一篇關于JAVA下單接口優(yōu)化實戰(zhàn)TPS性能提高10倍,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

概述

最近公司的下單接口有些慢,老板擔心無法支撐雙11,想讓我優(yōu)化一把,但是前提是不允許大改,因為下單接口太復雜了,如果改動太大,怕有風險。另外開發(fā)成本和測試成本也非常大。對于這種有挑戰(zhàn)性的任務,我向來是非常喜歡的,因為在解決問題的過程中,可以學習到很多東西。

當時我只是知道下單接口慢,但是沒人告訴我慢在哪里,也即是說,哪些瓶頸導致下單接口慢了。其實沒人知道也沒關系的,因為我們可以通過壓測來找到具體的瓶頸。

下面會詳細介紹一下,在本次壓測中遇到的問題以及如何解決,期間用了什么工具。

用到的工具和環(huán)境

工具

  • Jmeter
  • JAVA自帶的jvisualvm
  • JMX
  • nmon

環(huán)境

  • 騰訊云Mysql
  • 騰訊云2核4g的服務器1臺

找瓶頸

下單屬于寫接口,大部分情況下,瓶頸都出在DB里,程序可能都在等待DB鎖的釋放。為了驗證這個想法,我們可以使用Jmeterjvisualvm來驗證一下。

為了監(jiān)控服務器和服務器中JAVA進程,我們需要開啟JMX,可以在JAVA進程啟動的時候,添加如下幾個參數(shù):

JMX_OPTS="-Dcom.sun.management.jmxremote.port=7969 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=xx.xx.xx.xx"
nohup java ${JMX_OPTS} -jar xxxxx.jar

Djava.rmi.server.hostname填寫JAVA進程所在服務器的IP地址,-Dcom.sun.management.jmxremote.port=7969是指定JMX監(jiān)控端口的,這里是7969。

重新啟動進程后,打開本地的(我用的是Window10)jvisualvm,添加JMX配置。配置成功后,可以點擊線程那個tab,因為我們要做線程dump,觀察線程的執(zhí)行情況。

好了,現(xiàn)在我們可以使用Jmeter來對下單接口進行壓測了??梢韵扔?0線程并發(fā)壓,執(zhí)行時間是1分鐘。

在壓測的過程中,做一下線程dump,同時利用nmon觀察應用服務器CPU的負載情況。

負載很低,將線程并發(fā)調整到100后,CPU還是上不去,這樣的話,初步可以判斷,代碼里有鎖。
通過觀察dump文件,發(fā)現(xiàn)如下信息:

- locked <22f6e7f3> (a com.mysql.cj.core.io.ReadAheadInputStream)
- at com.sun.proxy.$Proxy231.reduceSkuStock(Unknown Source)

觸發(fā)這個lock的業(yè)務代碼是reduceSkuStock方法。通過閱讀代碼,發(fā)現(xiàn)reduceSkuStock被包在一個大事務里面。

@Transactional(rollbackFor = {Exception.class})
 createOrder() {
 //1、扣減庫存
 reduceSkuStock();
 //2、創(chuàng)建訂單
 insertOrder();
 //3、其他寫操作
 。。。。
}

庫存記錄通常存在一張獨立的庫存表,由于創(chuàng)建訂單的方法,是一個大事務,這樣就會導致某條庫存記錄只有當整個createorder()方法執(zhí)行完后,數(shù)據(jù)庫行鎖才會被釋放,在這個期間,其他線程是無法對這條庫存記錄進行寫操作的。因此我們可以在reduceSkuStock()中,再開一個事務,操作完這條庫存記錄后,趕緊釋放鎖,這樣應該可以提高一些性能。為了驗證是否是因為事務的原因導致下單接口慢,我們可以直接將createOrder()方法的事務去掉,再壓測一下。

壓測結果發(fā)現(xiàn),下單接口的TPS提高了一倍,CPU也上去了不少,但是仍然不夠理想,代碼里,應該還有其他的鎖。再次做線程dump,又發(fā)現(xiàn)了一個鎖。

- locked <438be230> (a org.apache.http.pool.AbstractConnPool$2)
- at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)

導致鎖的代碼是HttpClientexecute方法,該方法在執(zhí)行的時候,一直在等待獲取HTTP連接,通過查看源代碼,發(fā)現(xiàn)居然沒有使用連接池,醉了。趕緊加上如下代碼:

 PoolingHttpClientConnectionManager pool = new PoolingHttpClientConnectionManager();
 pool.setDefaultMaxPerRoute(400);
 httpClient = HttpClients.custom().setConnectionManager(pool).build();

再次壓測后,發(fā)現(xiàn)代碼里已經沒有鎖了。TPS提升了5倍。但是接下來還得做幾件事情:

1、打印下單接口的所有SQL,然后逐一進行explain操作,看看有沒有全表掃描的語句或者沒用到索引的SQL語句;
2、觀察下單接口執(zhí)行的過程中,FULL GC發(fā)生的次數(shù);
3、增加應用的MYSQL連接數(shù);

好了,到了這地方,我們可以回到前面,來解決庫存問題了。由于老板說,不能大改,因此我就在reduceSkuStock方法上,再開一個事務。

@Transactional(propagation = Propagation.REQUIRES_NEW)
reduceSkuStock(){}

讓執(zhí)行庫存操作的線程執(zhí)行完后,趕緊釋放行鎖。這樣做也有個風險,就是庫存扣減成功后,下單失敗了。不過這種情況比較少,因為當時的下單接口中,大部分業(yè)務邏輯都在前面做好判斷了,到達插入訂單的代碼時,就只是單獨的insert了,除非數(shù)據(jù)庫掛了,不然不會出現(xiàn)下單失敗的情況。

在開發(fā)環(huán)境下,經過調優(yōu)后,下單接口的TPS提升了3倍左右,當然由于開發(fā)環(huán)境的數(shù)據(jù)庫和應用服務器都比較差,也會對TPS有影響的。當時優(yōu)化完后,在生產上進行了壓測,發(fā)現(xiàn)TPS提升了10倍。

這個是下單接口的邏輯不能大改的情況下的優(yōu)化方案,一般來說,庫存操作應該是單獨的服務,可以單獨優(yōu)化的。而單純的下單邏輯也是可以優(yōu)化的。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

相關文章

  • JavaWeb?Hibernate使用全面介紹

    JavaWeb?Hibernate使用全面介紹

    在正式進入Hibernate的高級應用之前,需要了解聲明是數(shù)據(jù)模型與領域模型,這兩個概念將會幫助我們更好的理解實體對象的關聯(lián)關系映射
    2022-10-10
  • springboot2.2.2集成dubbo的實現(xiàn)方法

    springboot2.2.2集成dubbo的實現(xiàn)方法

    這篇文章主要介紹了springboot2.2.2集成dubbo的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • Springmvc restful配置遇到的小坑

    Springmvc restful配置遇到的小坑

    本文是小編給大家?guī)Я说腟pringmvc restful配置遇到的小小坑,小編給大家?guī)砹藛栴}原因及解決辦法,非常不錯,具有參考借鑒價值,感興趣的朋友一起看下吧
    2016-07-07
  • maven配置阿里倉庫的方法步驟

    maven配置阿里倉庫的方法步驟

    這篇文章主要介紹了maven配置阿里倉庫的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • Java基礎教程之字符流文件讀寫

    Java基礎教程之字符流文件讀寫

    這篇文章主要給大家介紹了關于Java基礎教程之字符流文件讀寫的相關資料,,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-07-07
  • 解決?IDEA?Maven?項目中"Could?not?find?artifact"?問題的常見情況和解決方案

    解決?IDEA?Maven?項目中"Could?not?find?artifact"?

    這篇文章主要介紹了解決IDEA Maven項目中Could not?find?artifact問題的常見情況和解決方案,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 深入了解Java設計模式之UML類圖

    深入了解Java設計模式之UML類圖

    UML?即?Unified?Modeling?Language?統(tǒng)一建模語言,是用來設計軟件的可視化建模語言。本文就帶大家了解一下UML中類圖的定義與使用,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-11-11
  • Java實現(xiàn)天天酷跑小游戲完整代碼(附源碼)

    Java實現(xiàn)天天酷跑小游戲完整代碼(附源碼)

    這篇文章主要介紹了使用Java實現(xiàn)天天酷跑(附源碼),本文通過實例圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Java解決計算相鄰兩個數(shù)的最大差值的問題

    Java解決計算相鄰兩個數(shù)的最大差值的問題

    今天給大家?guī)硪坏浪惴}:給定一個數(shù)組,求如果排序之后,相鄰兩數(shù)的最大差值。要求時間復雜度O(N),且要求不能用非基于比較的排序。快來跟隨小編一起學習一下如何解決這一問題吧
    2021-12-12
  • java對接webservice接口的4種方式總結

    java對接webservice接口的4種方式總結

    因工作需要和一個Sap相關系統(tǒng)以WebService的方式進行接口聯(lián)調,之前僅聽過這種技術,但并沒有實操過,所以將本次開發(fā)進行記錄,這篇文章主要給大家介紹了關于java對接webservice接口的4種方式,需要的朋友可以參考下
    2023-10-10

最新評論