項(xiàng)目上線之后,以為可以放松一段時(shí)間,結(jié)果又被老板叫回去連夜加班,優(yōu)化性能,提高系統(tǒng)在線并發(fā)數(shù)。滿腦子一頭霧水,不知道從何下手?今天小編就帶大家一起看看如何進(jìn)行系統(tǒng)系統(tǒng)優(yōu)化。

一、應(yīng)用服務(wù)性能優(yōu)化
1、優(yōu)化應(yīng)用服務(wù)框架,對代碼進(jìn)行重構(gòu),優(yōu)化SQL;
對項(xiàng)目中關(guān)鍵的接口,訪問頁面等進(jìn)行性能壓測,抓取數(shù)據(jù)庫AWR性能分析報(bào)告;通過分析報(bào)告,找出消耗時(shí)間比較長的SQL,并對其進(jìn)行優(yōu)化;如果數(shù)據(jù)庫服務(wù)購買的是云服務(wù)器,對應(yīng)云服務(wù)器廠商都有服務(wù)器后臺,可以查看慢SQL的運(yùn)行情況。


在應(yīng)用框升級改造的同時(shí),也應(yīng)充分考慮該架構(gòu)的安全性,包括B/S形式的安全,主要體現(xiàn)在應(yīng)用數(shù)據(jù)和用戶會(huì)話的安全,還應(yīng)當(dāng)考慮系統(tǒng)自身體系架構(gòu)內(nèi)部的安全,以及與外系統(tǒng)接口的安全。針對某些特殊應(yīng)用,還需考慮恢復(fù)、抗攻擊等安全機(jī)制。

(1)業(yè)務(wù)安全:主要是指業(yè)務(wù)系統(tǒng)的自身業(yè)務(wù)流程和數(shù)據(jù)的安全,其中包括:身份一致性、業(yè)務(wù)數(shù)據(jù)篡改和關(guān)鍵流程繞過等;
(2)應(yīng)用安全:主要指應(yīng)用系統(tǒng)非功能性需求的信息安全,主要包括:SQL注入、XSS攻擊、框架注入等安全防護(hù);
(3)中間件安全:主要是指采用的第三方開源或非開源的組件服務(wù),比如,tomcat服務(wù)、消息中間件、mysql、structs2.0組件等;
(4)主機(jī)安全:主機(jī)是指系統(tǒng)所運(yùn)行的服務(wù)器的安全防護(hù),包括:服務(wù)器的弱口令、口令的強(qiáng)度策略、操作系統(tǒng)特權(quán)、惡意代碼或病毒的檢測等;
(5)數(shù)據(jù)安全:主要指HTTP業(yè)務(wù)數(shù)據(jù)、數(shù)據(jù)庫數(shù)據(jù)、資源文件等信息的安全防護(hù),包括信息的脫敏、信息的加密、文件的下載限制等;
(6)網(wǎng)絡(luò)安全:主要是指系統(tǒng)所在網(wǎng)絡(luò)安全監(jiān)控、流量預(yù)警、防火墻規(guī)則設(shè)置、源IP地址請求限制等防護(hù),能夠抵御端口掃描、強(qiáng)力攻擊、木馬后門攻擊、拒絕服務(wù)攻擊、緩沖區(qū)溢出攻擊、IP碎片攻擊和網(wǎng)絡(luò)蠕蟲攻擊。
2、增加數(shù)據(jù)一、二級緩存,減輕數(shù)據(jù)庫壓力
增加數(shù)據(jù)一、二級緩存,減輕數(shù)據(jù)庫壓力,包括應(yīng)用緩存,網(wǎng)絡(luò)緩存;比如使用Redis緩存集群服務(wù);
使用redis數(shù)據(jù)緩存,相信很多開發(fā)人員比較熟悉,很多的開源項(xiàng)目也都會(huì)集成redis服務(wù),那么使用redis到底有什么好處呢?
(1)讀寫速度快,這也是他最大的優(yōu)勢了,redis把數(shù)據(jù)存儲在內(nèi)存中,不需要直接請求數(shù)據(jù)庫;
(2)支持的數(shù)據(jù)類型資源豐富,可以支持支持HashMap、string,list等等;
(3)支持事務(wù),操作都是原子性操作。即對數(shù)據(jù)的更改要么全部執(zhí)行,要么全部不執(zhí)行;
(4)可以自定義設(shè)置緩存的生命周期,設(shè)置過期時(shí)間,過期后將會(huì)自動(dòng)刪除,不影響更新數(shù)據(jù)的緩存。
3、調(diào)整應(yīng)用服務(wù)部署架構(gòu),增加服務(wù)的負(fù)載能力
若應(yīng)用服務(wù)是單應(yīng)用節(jié)點(diǎn)部署方式,可以擴(kuò)展服務(wù)部署節(jié)點(diǎn)數(shù)和物理服務(wù)器數(shù),防止單點(diǎn)故障;除此之外,也可把應(yīng)用服務(wù)中高并發(fā)的讀寫服務(wù)分離,一個(gè)服務(wù)只負(fù)責(zé)讀,另外一個(gè)服務(wù)只負(fù)責(zé)寫。通過代理服務(wù),對多個(gè)物理服務(wù)進(jìn)行負(fù)載均衡,設(shè)置策略,應(yīng)用服務(wù)會(huì)優(yōu)先訪問優(yōu)先級比較高的服務(wù)節(jié)點(diǎn)。

4、升級系統(tǒng)框架,提高系統(tǒng)可拓展性
升級系統(tǒng)框架,提高系統(tǒng)可拓展性,使系統(tǒng)可以滿足對接更多的中間件和第三方支持等。比如使用RabbitMQ消息隊(duì)列主要有以下優(yōu)勢:
(1)異步解耦:消息隊(duì)列 AMQP可用于單體應(yīng)用被拆解為微服務(wù)后不同微服務(wù)間的通信。應(yīng)用解耦的好處是不同應(yīng)用的迭代不再相互依賴,而異步通信的好處是數(shù)據(jù)不再需要被立即處理。異步解耦能有效縮短數(shù)據(jù)鏈路長度,提高數(shù)據(jù)處理效率;
(2)削峰填谷:大型活動(dòng)帶來較高流量脈沖時(shí),沒有做好相應(yīng)保護(hù)容易導(dǎo)致系統(tǒng)超負(fù)荷甚至崩潰,限制太過則會(huì)導(dǎo)致請求大量失敗而影響用戶體驗(yàn)。消息隊(duì)列 AMQP 版能做到削峰填。其超高性能的消息處理能力可以承接流量脈沖而不被擊垮,在確保系統(tǒng)可用性同時(shí),因快速有效的請求響應(yīng)而提升用戶的體驗(yàn)。其海量消息堆積能力確保下游業(yè)務(wù)在安全水位內(nèi)平滑穩(wěn)定的運(yùn)行,避免超高流量的沖擊;
(3)分布式緩存同步:大量并發(fā)訪問數(shù)據(jù)庫會(huì)導(dǎo)致頁面響應(yīng)時(shí)間長。通過消息隊(duì)列 AMQP 版構(gòu)建分布式緩存,能實(shí)時(shí)通知數(shù)據(jù)變化,有效降低頁面響應(yīng)時(shí)間,滿足對變更的大量訪問需求;
5、資源性能優(yōu)化
對于普通的網(wǎng)頁訪問,80%的響應(yīng)時(shí)間消耗在前端,動(dòng)態(tài)請求時(shí)間占比較少,優(yōu)化難度大。那么我們可以從哪些方面來進(jìn)行優(yōu)化呢?小編羅列了以下幾點(diǎn):
(1)使用更少的HTTP請求:每個(gè)HTTP請求都需要經(jīng)歷以下過程:阻擋->建立連接->發(fā)送請求->等待響應(yīng)->接收數(shù)據(jù);請求的HTTP請求越少,建立連接的過程也就越少;
(2)資源壓縮合并: 對文件大小比較大的圖片、JS、CSS等資源進(jìn)行壓縮或者合并;
(3)添加過期頭:瀏覽器每次請求資源前檢查通過max-age、expires檢查本地資源是否可用,如果可用將不發(fā)起請求到服務(wù)器,以此節(jié)約服務(wù)器資源,加快網(wǎng)頁加載速度;
(4)使用云上文件存儲服務(wù):文件資源可以上傳到阿里云OSS或者華為云OBS等文件存儲服務(wù),達(dá)到可以對資源服務(wù)進(jìn)行CDN加速,提高資源的訪問速度
二、數(shù)據(jù)庫性能優(yōu)化
1、冗余表字段、減少表關(guān)聯(lián)操作
我們在初始數(shù)據(jù)庫表結(jié)構(gòu)的建模設(shè)計(jì)時(shí),可能諸多世界無法考慮周全,導(dǎo)致部分字段定義過大,表結(jié)構(gòu)定義的字段與實(shí)際使用占用大小相差較大?;蛘卟糠直淼娜哂嘧侄芜^多,甚至有一部分的冗余字段始終為空。針對這樣的問題,小編建議應(yīng)當(dāng)實(shí)際情況定義各字段大小,并縮小冗余字段大小。選擇合理的大小可以大大減小磁盤空間及磁盤I/O讀寫開銷,減小內(nèi)存占用,減小CPU的占用率。
小編遇到的另外一個(gè)問題就是部分表的設(shè)計(jì)拆分過細(xì),主表保存的字段信息很少,很多業(yè)務(wù)在查詢時(shí)都需要同時(shí)很多子表,有一部分信息完全可以放置在主表中,減少關(guān)聯(lián)表的查詢。
除此之外,小編建議大家在開發(fā)項(xiàng)目中建議根據(jù)實(shí)際業(yè)務(wù)需求整理一份數(shù)據(jù)字典,便于系統(tǒng)的運(yùn)營維護(hù)。
2、索引創(chuàng)建
大家有沒有遇到以下一些問題呢?
(1)部分表無主鍵和索引,部分表數(shù)據(jù)量較大,但是表結(jié)構(gòu)既沒有主鍵也沒索引
(2)部分表ID已經(jīng)有主鍵,但又創(chuàng)建了唯一索引
(3)部分表的聯(lián)合索引過多
(4)空字段導(dǎo)致索引不生效
小編給出以下一些建議:
(1)根據(jù)實(shí)際生產(chǎn)的增刪改查語句進(jìn)行分析,創(chuàng)建索引;
(2)同一個(gè)表的同一字段已設(shè)置成主鍵,無須再創(chuàng)建唯一索引;
(3)聯(lián)合索引需要根據(jù)SQL語句所需進(jìn)行創(chuàng)建,無須太多,容易造成解析計(jì)劃混亂;
(4)建議部分語句中增加強(qiáng)制索引
3、根據(jù)業(yè)務(wù)場景區(qū)分讀寫操作,訪問讀寫數(shù)據(jù)庫
數(shù)據(jù)庫讀寫分離有一個(gè)前提就是,數(shù)據(jù)庫有多個(gè)備份,有主庫,有從庫。讀寫分離就是基于主從復(fù)制架構(gòu),一個(gè)主庫,有多個(gè)從庫,主庫主要負(fù)責(zé)寫,寫完后主庫會(huì)自動(dòng)把數(shù)據(jù)同步給從庫,從庫執(zhí)行查詢的一些操作
4、根據(jù)查詢條件對大數(shù)據(jù)表進(jìn)行分庫分區(qū)
分庫,又叫垂直切分,就是把原本存儲于一個(gè)庫的表拆分存儲到多個(gè)庫上,通常是將表按照功能模塊、關(guān)系密切程度劃分出來,部署到不同的庫上。如果數(shù)據(jù)庫是因?yàn)楸硖喽斐珊A繑?shù)據(jù),并且項(xiàng)目的各項(xiàng)業(yè)務(wù)邏輯劃分清晰、低耦合,那么規(guī)則簡單明了、容易實(shí)施的首選就是分庫。分庫的優(yōu)點(diǎn)是:實(shí)現(xiàn)簡單,庫與庫之間界限分明,便于維護(hù),缺點(diǎn)是不利于頻繁跨庫操作,單表數(shù)據(jù)量大的問題解決不了;
分區(qū),顧名思義就是將一個(gè)表分解成多個(gè)區(qū)塊進(jìn)行操作和保存,從而降低每次操作的數(shù)據(jù),提高性能。而對應(yīng)用來說是透明的,從邏輯上看是只有一個(gè)表,但在物理上這個(gè)表可能是由多個(gè)物理分區(qū)組成的,每個(gè)分區(qū)都是一個(gè)獨(dú)立的對象,可以進(jìn)行獨(dú)立處理。
5、調(diào)整數(shù)據(jù)連接池配置
系統(tǒng)需要滿足不同的并發(fā)數(shù),項(xiàng)目中需要配置數(shù)據(jù)庫連接池的大小,可根據(jù)并發(fā)來設(shè)置連接池的各項(xiàng)參數(shù)。以MYSQL為例,可以從以下幾個(gè)參數(shù)進(jìn)行優(yōu)化設(shè)置:
(1)連接池支持的最大連接數(shù)maxActive,并發(fā)100的時(shí)候該值就可以設(shè)置為100;
(2)連接池中最多可空閑連接數(shù)maxIdle,該值表示即使沒有數(shù)據(jù)庫連接時(shí)依然可以保持空閑的連接數(shù),而不被清除;
(3)連接池中最小空閑連接數(shù)minIdle,當(dāng)連接數(shù)少于此值時(shí),連接池會(huì)創(chuàng)建連接來補(bǔ)充到該值的數(shù)量;
(4)初始化連接數(shù)目initialSize;
(5)最大請求等待時(shí)間maxWait,連接池中連接用完時(shí),新的請求等待時(shí)間。
以上從應(yīng)用服務(wù)和數(shù)據(jù)庫兩個(gè)大塊介紹了性能優(yōu)化的一些知識,希望在大家以后的項(xiàng)目優(yōu)化中可以作為一個(gè)參考,如果還有其他比較好的建議,也可以給小編留言哦。