摘要:伴隨Web2.0興起后出現(xiàn)的新一輪的網(wǎng)站開發(fā)創(chuàng)業(yè)大潮
中,網(wǎng)站用戶不僅是內(nèi)容的瀏覽者,而且成為了網(wǎng)站內(nèi)容的制造者。這決定了網(wǎng)站結(jié)構(gòu)上以數(shù)據(jù)庫(kù)為中心,以用戶為導(dǎo)向的新網(wǎng)站建設(shè)概念,使得新網(wǎng)站具有高并發(fā)、高流量、大數(shù)據(jù)量、邏輯復(fù)雜等特點(diǎn)。筆者圍繞網(wǎng)站的高并發(fā)特性,討論數(shù)據(jù)庫(kù)優(yōu)化、分布式網(wǎng)站的編程要點(diǎn)、以及程序核心優(yōu)化三方面的技巧。
關(guān)鍵詞:服務(wù)器 數(shù)據(jù)庫(kù) 分布式開發(fā)
1 數(shù)據(jù)庫(kù)優(yōu)化技巧
現(xiàn)在網(wǎng)站的特點(diǎn),就是以數(shù)據(jù)庫(kù)為中心。如何最大化地利用數(shù)據(jù)庫(kù)的能力,包括提高緩存命中、降低IO開銷、優(yōu)化查詢等,是目前需要進(jìn)一步研究的課題。
1.1 確定主鍵 主鍵是能唯一標(biāo)識(shí)表中數(shù)據(jù)行的屬性或者組合屬性。主鍵中該表中的值必須唯一。如果數(shù)據(jù)更新不頻繁,必須需要對(duì)主鍵進(jìn)行排序,一定要是聚集索引;如果數(shù)據(jù)更新頻繁,主鍵上一定要使用非聚集索引。
1.2 優(yōu)化索引 數(shù)據(jù)庫(kù)表索引是避免全表掃描,降低數(shù)據(jù)庫(kù)磁盤IO的最重要的手段。關(guān)系型數(shù)據(jù)庫(kù)中,每個(gè)數(shù)據(jù)表不是孤立存在的,而是通過主、外鍵聯(lián)系起來,共同形成完整的數(shù)據(jù)庫(kù)結(jié)構(gòu)。所以,除了主鍵必須有索引外,外鍵通常也需要有非聚集索引,以方便對(duì)數(shù)據(jù)進(jìn)行分類查詢和匯總。幾乎每個(gè)表中,都需要有和時(shí)間相關(guān)的字段。常用的網(wǎng)站用例中,多對(duì)數(shù)據(jù)的時(shí)間段進(jìn)行查詢、匯總,所以對(duì)這些時(shí)間字段,一定要建立聚集索引,方便進(jìn)行排序查詢,避免全表掃描。
1.3 合理選用共享鎖和排它鎖 死鎖對(duì)數(shù)據(jù)庫(kù)的性能、可用性、吞吐量都有重要的影響。但在現(xiàn)在企業(yè)的信息化管理系統(tǒng)中,經(jīng)常是可以由多個(gè)人同時(shí)對(duì)同個(gè)表進(jìn)行操作,造成死鎖的概率大大增加。一般情況下,如果對(duì)數(shù)據(jù)的一致性要求很高,使用排它鎖,其它都應(yīng)該使用共享鎖來提高性能。
1.4 分表 在實(shí)踐工作中,數(shù)據(jù)表中的每列的數(shù)據(jù)都有其特定的使用場(chǎng)景。例如新聞表,在對(duì)新聞進(jìn)行列表時(shí),常使用新聞標(biāo)識(shí)、新聞分類、新聞添加人、新聞時(shí)間信息,但不會(huì)使用新聞內(nèi)容字段。并且新聞內(nèi)容的字段一般為“Text”類型。對(duì)于這種情況,我們一般把新聞表拆分成兩個(gè)表,一個(gè)新聞表(包含常用用于檢查的字段),一個(gè)新聞內(nèi)容表(只有新聞的內(nèi)容)。從而讓程序員使用常規(guī)方法,只檢索出來常用的小數(shù)據(jù)量屬性,只要表示新聞時(shí),才加載超大的“Text”類型的新聞內(nèi)容,大大降低了數(shù)據(jù)的IO開銷和網(wǎng)絡(luò)開銷、提高數(shù)據(jù)庫(kù)的吞吐量。
1.5 數(shù)據(jù)冗余 在關(guān)系型數(shù)據(jù)庫(kù)中,有些查詢頻次很高,但需要的數(shù)據(jù)字段又分屬于不同的表,需要多達(dá)4個(gè)表以上才能選到所需要的全部數(shù)據(jù)。此時(shí),會(huì)造成表關(guān)聯(lián)造成的開銷過大,查詢時(shí)間較長(zhǎng)。此時(shí),可以通過空間來?yè)Q時(shí)間。把表中的某個(gè)常用屬性,依業(yè)務(wù)需要,在其它的表中冗余存儲(chǔ),這樣就減少了表關(guān)聯(lián)的次數(shù),提高了性能。
2 分布式網(wǎng)站編程要點(diǎn)
2.1 面向服務(wù)編程便于橫向擴(kuò)展 復(fù)雜的網(wǎng)站由許多功能模塊組成,有的系統(tǒng)之間的模塊是相同的。隨著業(yè)務(wù)的拓展,有的功能模塊逐漸成為系統(tǒng)的“瓶頸”,需要單獨(dú)擴(kuò)容。面向服務(wù)的模塊可以支持單獨(dú)擴(kuò)容。
企業(yè)信息化是整體的信息化。在設(shè)計(jì)每個(gè)局部的信息化產(chǎn)品時(shí),如果站在企業(yè)的角度,就可以更合理地抽象出來服務(wù)模塊。對(duì)這些服務(wù)模塊定義接口,然后單實(shí)現(xiàn)和部署。
面向服務(wù)是全面實(shí)現(xiàn)企業(yè)信息化的有利工具。對(duì)服務(wù)的良好規(guī)劃,有利于將來平衡地引入企業(yè)服務(wù)總線,更好地統(tǒng)計(jì)、監(jiān)控每個(gè)服務(wù)的運(yùn)行狀態(tài),及時(shí)地發(fā)現(xiàn)信息化的性能瓶頸并定位解決。
2.2 分布式緩存減少數(shù)據(jù)庫(kù)交互 企業(yè)信息化中,大部分系統(tǒng)數(shù)據(jù)展示的頻次遠(yuǎn)大于被更新的頻次。利用這些,我們可以把近一段經(jīng)常被展示的數(shù)據(jù)緩存到分布式緩存中。這樣下一次相同的頁(yè)面被打開或查詢被執(zhí)行時(shí),可以在緩存中直接命中結(jié)果,省去了查詢數(shù)據(jù)庫(kù)和運(yùn)算加工的開銷,加快頁(yè)面展示速度,提高用戶體驗(yàn)。分面式緩存使用淘汰算法,來保證緩存在內(nèi)存中的數(shù)據(jù)不會(huì)造成內(nèi)存溢出。常用的算法有最近最少使用算法(LRU)。
2.3 Client Cookie方便分布式部署 企業(yè)網(wǎng)站被打開時(shí),一般是具有用戶的身份信息的。傳統(tǒng)的網(wǎng)站中,身份信息保存在Session(會(huì)話)中,而Session默認(rèn)保存到每個(gè)服務(wù)器的進(jìn)程中。服務(wù)器中的Session信息不能被其它服務(wù)器上的網(wǎng)站使用。還有共享式Session,單獨(dú)出來某服務(wù)器保存Session信息,其它的網(wǎng)站都訪問讀寫共享Session服務(wù)器。這解決了分布式環(huán)境中,用戶從一臺(tái)網(wǎng)站跳到別一臺(tái)網(wǎng)站身份丟失的情況,但使共享式Session成為單點(diǎn),性能也因?yàn)楣蚕硎絊ession的集中性而損失。
為了解決上述問題,在分布式環(huán)境中,通過把Session信息,加密后保存在Cookie中是更好的方案。用戶瀏覽器訪問網(wǎng)站的時(shí)候,總是會(huì)把Cookie信息提交到服務(wù)器,服務(wù)器進(jìn)行解密后,就可以得到訪問用戶的信息,繼續(xù)為用戶服務(wù)。同時(shí),因?yàn)镃ookie保存在每個(gè)用戶的計(jì)算機(jī)上,同時(shí)加解密同時(shí)在每個(gè)服務(wù)器上運(yùn)行,不存在單點(diǎn)問題,理論上可以無限進(jìn)行擴(kuò)容。
3 結(jié)束語(yǔ)
設(shè)計(jì)高并發(fā)網(wǎng)站不是一日之功,上述只是闡述了最基本的原理。相信只要努力做到設(shè)計(jì)精致化,并時(shí)時(shí)考慮如何更有效地實(shí)現(xiàn)并行計(jì)算和運(yùn)行,網(wǎng)站的并發(fā)性能一定會(huì)步步高升。
參考文獻(xiàn):
[1]梅華威,張銘泉,李天.高并發(fā)高負(fù)載網(wǎng)站系統(tǒng)架構(gòu)研究[J].計(jì)算機(jī)與網(wǎng)絡(luò),2009(14).
[2]李宇,曾志文,湯明.大型高并發(fā)高負(fù)載網(wǎng)站優(yōu)化策略探討[J].希望月報(bào)(上半月),2007(11).
[3]劉軍.高并發(fā)數(shù)據(jù)庫(kù)下的索引創(chuàng)建和使用技巧[J].中小企業(yè)管理與科技(下旬刊),2012(12).