電商平臺-效能優化以及伺服器優化的設計與架構
說明:Java開源生鮮電商平臺-效能優化以及伺服器優化的設計與架構,我採用以下三種維度來講解
1. 程式碼層面。
2. 資料庫層面。
3. 伺服器層面
誠然,效能優化這個方面的確是一個長期的過程,並不是大夥們看了我的文章後就覺得可以做的很好的,我這邊只是起一個拋磚引玉的作用,給大夥一種解決問題的思路與方向。
1. Java程式碼層面優化
補充說明:Java程式碼層面優化,你需要知道的是,那些程式碼需要優化,我們知道八二定律告訴我們,80%的效能問題出在20%的程式碼上,我們需要的是找到那些20%的程式碼進行鍼
對性的優化,這樣才能把服務的質量優化得最好。
那麼如何進行監控呢?又怎麼樣進行監控呢?
我列舉幾個常見的優化方案:用實戰來說明一切。
看以下程式碼:
我們知道,買家在支付成功後,支付寶或者微信會服務端回撥,然後我們處理自己的業務。
相應的業務,我們在訂單伺服器層建立一個方法:
/** * 支付返回 * @return orderInfo 訂單資訊 */ public void payReturn(OrderInfo orderInfo,PayLogs payLogs);
業務實現有以下需要注意的,(我只分享核心內容,非核心的大家自己去看原始碼即可)
1. 更新支付狀態,變成已付款,
2.更新配送狀態,待配送。
3. 更改交易日誌表,變成已經付款。
4. 更新訂單明細表,記錄所有的訂單明細都有效。
5.更新使用者的餘額為0,
6. 記錄相關的操作日誌等等。
相應的程式碼如下:(spring 事物控制在服務層,如果以上6個步驟有一個錯誤,則全部回滾。)
@Override public void payReturn(OrderInfo orderInfo, PayLogs payLogs) { orderInfoDao.payReturn(orderInfo); orderItemDao.updateOrderItemByOrderNumber(orderInfo.getOrderNumber()); buyerDao.updateBuyerBalanceToZero(orderInfo.getBuyerId()); payLogsDao.updatePayLogs(payLogs); logDao.insertOperatorLogs(orderInfo,payLogs); }
我們發現,以上6補需要採用5個數據庫連線才可以完成,而且在同一個事務裡面,因為需要保證資料的一致性。
我們發現,整個業務的操作需要2s完成,對於我們監控業務在500ms的目標,相距太遠了,怎麼辦?
以上程式碼,究竟那塊的效能最差呢?
orderInfoDao.payReturn(orderInfo); 花費:100ms
orderItemDao.updateOrderItemByOrderNumber(orderInfo.getOrderNumber()); 花費300ms
buyerDao.updateBuyerBalanceToZero(orderInfo.getBuyerId()); 花費200ms
payLogsDao.updatePayLogs(payLogs); 花費800ms
logDao.insertOperatorLogs(orderInfo,payLogs); 花費600ms
綜合以上分析,我們需要把同步改成非同步,分析出問題的關鍵。
payLogsDao.updatePayLogs(payLogs); 這塊程式碼進行了優化。
我們驚奇的發現,使用者存在刷單的情況,就是不停的支付,就是不支付,對於線上1000多個買家而言,平均每天2單-5單,每單平均訂單數在1-10之間
那麼一個月的訂單日誌記錄就是:1000*30*5*10=1500000記錄,我的天,問題出在這裡。日誌表也有巨大的量。
最終解決方案:同步改非同步進行處理。用redis佇列處理,最終效能提高到了500ms內。
一個核心的思想就是:找出問題,解決問題,分而治之的原理進行處理。但是大部分人都輸在找問題在,不是找問題難,而是找到核心出問題的程式碼難。監控那篇文章大夥可以再看看。
2. 資料庫方面
補充說明:資料庫方面無外乎就是關聯查詢的時候,增加索引,使查詢效能更高。那麼到底如何做呢?
查詢優化:
1.使用慢查詢日誌去發現慢查詢。
2. 使用執行計劃去判斷查詢是否正常執行。
3. 總是去測試你的查詢看看是否他們執行在最佳狀態下 –久而久之效能總會變化。
4. 避免在整個表上使用count(*),它可能鎖住整張表。
相關的優化理論,我已經整理到以前的一篇文章了,這邊就不再列舉
檢視《Mysql效能優化》---https://www.cnblogs.com/jurendage/p/3798703.html
3. 伺服器監控
說明:我們所說的伺服器優化,很大部分是指的tomcat的優化,而不是大家所說的Linux本身的優化,當然這樣文章很多,筆者只是用實際說話,看看我們的B2B電商平臺如何進行伺服器效能的優化。
3.1 tomcat的JVM優化。
這個根據大家自己的電腦進行配置,具體情況需要大家百度自己研究,說來話長
#!/bin/sh
JAVA_OPTS="-server -Xms1024M -Xmx1024M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/log/buyer/gcdump -XX:MaxTenuringThreshold=15 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true"
這個是筆者的阿里雲的伺服器的優化。
3.2 tomcat的連線池優化
<Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
maxConnections="1000"
maxThreads="100"
minSpareThreads="50"
acceptCount="500"
enableLookups="false"
compression="on"
URIEncoding="UTF-8"
redirectPort="8443" />
相關的優化方案可能很多,但是這些都是筆者1年半的實戰總結,可能又不算很好的地方,但是穩定性壓倒一切,希望分享出來,一起努力。。
總結:優化是一個長期的過程,無外乎就是程式碼級別,資料庫級別,伺服器級別,負載均衡等等手段
我寫文章的目的也跟大家說下,以免大家誤會
第一,專案生產環境運行了一年半了.
第二,這個是技術分享.
第三,我忍不是很頑固,是很執著。
第四,我想讓更多的人學習好技術一起奮鬥,所以我堅持,天天寫,日日寫,月月寫。
第五,如果你寫過部落格,你就知道堅持是很難的一件事情,
第六,你要知道我每篇文章都是cnblogs的頭條,而且每篇文章的都是精華,訪問量都到3000+
其實我需要的互相學習,互相進步,僅此而已。