內(nèi)容摘要
一、如何快速實現(xiàn)從0到1的過程
二、如何以高可用性贏得用戶信賴
三、如何提升系統(tǒng)整體的性能
大家好,我是逸創(chuàng)云客服(kf5.com)的劉銘。非常感謝DBA+社群給予我的這次分享機會,希望能借此機會跟各位大牛一起交流學(xué)習(xí)。我分享的主題是,從技術(shù)架構(gòu)看如何打造專業(yè)的SaaS客服平臺,主要內(nèi)容涵蓋了SaaS客服平臺在不同發(fā)展階段面臨的問題以及如何解決。整個分享是本人基于實踐經(jīng)驗得出的一些體會,希望和大家互相交流,共同進步。
一、如何快速實現(xiàn)從0 到1的過程
互聯(lián)網(wǎng)創(chuàng)業(yè)產(chǎn)品初期規(guī)模很小,資金也不多,一般采用簡單清晰,容易開發(fā)的架構(gòu)思路。并基于流行的開發(fā)語言和框架進行開發(fā),追求盡快將產(chǎn)品打造出來,第一時間進入市場。初期階段應(yīng)該關(guān)注產(chǎn)品面向的用戶群,以及產(chǎn)品如何滿足用戶需求。要相信好的架構(gòu)不是設(shè)計出來的,而是根據(jù)業(yè)務(wù)發(fā)展演化出來的。
在這個從0到1,從無到有的過程,逸創(chuàng)云客服采用了常見的LAMP組合,開發(fā)框架上采用了Yii。其他類似的組合還有Ruby on Rails,Python with Django等,這些技術(shù)組合大同小異,沒必要糾結(jié)到底哪個最好。初期技術(shù)選型的依據(jù)可以從團隊人員的技能儲備,技術(shù)社區(qū)的活躍度,招聘人才的人力成本來考量。隨著云計算服務(wù)平臺越來越成熟,建議選擇適合的云主機,將服務(wù)部署在云上,節(jié)約更多的時間與成本,后期也能靈活進行擴展。
二、如何以高可用性贏得用戶信賴
產(chǎn)品打造出來后,如果產(chǎn)品能夠解決用戶痛點,就會有更多用戶來使用服務(wù)。隨著用戶規(guī)模增大,web系統(tǒng)響應(yīng)延遲、數(shù)據(jù)庫查詢緩慢等問題日益凸顯。在保持產(chǎn)品迭代的同時,就要為架構(gòu)設(shè)計留出更多空間。此時架構(gòu)設(shè)計的首要目標(biāo)是解決可用性問題,基本要求是不能有單點故障,基本方法就是分層和冗余。首先需要把服務(wù)拆分成應(yīng)用層和數(shù)據(jù)層,也就是把單臺服務(wù)器,分成程序服務(wù)器和數(shù)據(jù)庫服務(wù)器,有的還需要分離出緩存服務(wù)器、文件服務(wù)器。
分享一個架構(gòu)圖,如下所示:
1、通過負(fù)載均衡實現(xiàn)應(yīng)用層高可用
負(fù)載均衡的目的是為了構(gòu)建應(yīng)用服務(wù)器集群。當(dāng)一臺應(yīng)用服務(wù)器宕機,會由其他應(yīng)用服務(wù)器接管,整個系統(tǒng)對用戶始終保持可用。負(fù)載均衡也能起到讓集群來分擔(dān)訪問壓力的作用。實現(xiàn)方式上,可以先利用Nginx反向代理實現(xiàn)Http轉(zhuǎn)發(fā)負(fù)載均衡,而規(guī)模稍大后則利用LVS實現(xiàn)IP層負(fù)載均衡或者數(shù)據(jù)鏈路層負(fù)載均衡。
搭建負(fù)載均衡的前提是把應(yīng)用層變成無狀態(tài)的。例如web服務(wù)中常用的session,這種狀態(tài)保持要求相同用戶的請求都在同一臺機器上處理。雖然可以利用 session綁定IP的方式,將來自同一ip的請求轉(zhuǎn)發(fā)到同一臺服務(wù)器,但是假設(shè)那臺服務(wù)器宕機,用戶狀態(tài)就會失效,仍然達不到高可用的效果。這時最好的方式就獨立部署session服務(wù)器,可以利用緩存來實現(xiàn)。
2、通過主從復(fù)制實現(xiàn)數(shù)據(jù)層高可用
目前主流數(shù)據(jù)庫都支持主從復(fù)制,基本原理是從庫監(jiān)聽主庫的日志變動,將這個數(shù)據(jù)變動及時同步到從庫。從庫既可以起到數(shù)據(jù)備份的作用,也可以在主庫出現(xiàn)問題時,取代主庫的角色,從而實現(xiàn)高可用。可根據(jù)業(yè)務(wù)的特性,設(shè)置合適的主從庫比例,一般是一主三從。
為了更好的利用數(shù)據(jù)庫主從機制,還可以進行讀寫分離,從而改善數(shù)據(jù)庫的負(fù)載壓力。數(shù)據(jù)寫操作必須在主庫上,讀操作盡可能的在從庫上進行。要進行讀寫分離,首先要面臨的問題是數(shù)據(jù)同步延時。這個同步延時雖然可以通過一些方式來減少延時時間,但始終無法避免。解決這個問題,有一種思路是將更新的數(shù)據(jù)保存在緩存中,如果在寫操作后需要讀取,則優(yōu)先從緩存中取用,但這種方式增大了應(yīng)用程序的復(fù)雜度。另一種比較推薦的方式,是在應(yīng)用層或數(shù)據(jù)層做一個代理,這個代理要實現(xiàn)的是在寫操作進行后,數(shù)據(jù)完全同步至從庫前,強制從主庫讀取,這樣就能保證數(shù)據(jù)的實時性。
三、如何提升系統(tǒng)整體的性能
1、使用分布式緩存提升網(wǎng)站性能
通過合理的緩存設(shè)計,可以大大減少數(shù)據(jù)庫的訪問壓力,提高網(wǎng)站的訪問速度。常見的緩存服務(wù)是Memcached和Redis。在設(shè)計緩存的時候,需要注意提升緩存的命中率,在緩存數(shù)據(jù)更新前至少讀兩次,緩存才有意義。此外還得保證緩存數(shù)據(jù)的一致性,可以設(shè)置緩存失效時間,并在數(shù)據(jù)被更新時重寫緩存。分布式緩存的存儲空間和計算資源不受單機限制,方便擴容和更新。其核心問題是路由算法,數(shù)據(jù)分布可采用一致性Hash算法,來減小緩存節(jié)點變化帶來的影響。
2、靜態(tài)內(nèi)容CDN加速
為了使不同國家和地區(qū)的用戶都能流暢的訪問網(wǎng)站服務(wù),可以使用CDN來減少網(wǎng)絡(luò)延遲。現(xiàn)在有很多云計算平臺提供CDN服務(wù),關(guān)于各家的服務(wù)的對比數(shù)據(jù)也有很多。選擇CDN服務(wù)的依據(jù)可以從廠商的節(jié)點數(shù)量,系統(tǒng)現(xiàn)有文件的存儲方式,接入成本來考量。
3、持續(xù)優(yōu)化用戶體驗
在用戶體驗上面,除了追求小而美的產(chǎn)品設(shè)計,還有個利器就是采用前端框架將web應(yīng)用轉(zhuǎn)換為單頁應(yīng)用。讓用戶在瀏覽器里就能得到如同客戶端般的體驗,操作網(wǎng)頁里的內(nèi)容不用刷新頁面。如今各種前端框架日趨成熟,逸創(chuàng)云客服使用的前端框架有Backbone,Ember。前者屬于輕量型,應(yīng)用在了普通用戶聊天端。后者適合處理復(fù)雜場景,應(yīng)用在了客服工單系統(tǒng)后臺。
使用前端框架的優(yōu)點是分離了前后端,只通過接口進行交互。后端不用再負(fù)責(zé)模板渲染,輸出頁面的工作,web前端和各種移動端角色對等,后端API可以通用化。在進行單頁改造時,需要注意利用前端的數(shù)據(jù)模型層,已經(jīng)獲取過的數(shù)據(jù)就不用再次請求了,從而進一步提高前端應(yīng)用的性能,并減輕后端服務(wù)壓力。另外還要定義好前后端的數(shù)據(jù)交互規(guī)范,可以采用Restful API,還可以使用JSON API。如果前端經(jīng)常需要獲取關(guān)聯(lián)的多個資源對象,并且對象之間的關(guān)聯(lián)關(guān)系比較復(fù)雜,建議使用JSON API。
4、高級搜索
隨著業(yè)務(wù)產(chǎn)生的數(shù)據(jù)越來越多,當(dāng)用戶需要從關(guān)系型數(shù)據(jù)庫中搜索想要的數(shù)據(jù)時,結(jié)果往往不盡人意。因為關(guān)系型數(shù)據(jù)庫很難實現(xiàn)中文分詞查詢,或者按照搜索結(jié)果的相關(guān)性進行排序,此時就需要搭建一個搜索引擎。開源的搜索引擎有很多,推薦Elasticsearch,原因是它支持分布式實時搜索,提供Restful API,采用多分片機制保證數(shù)據(jù)安全。在搭建搜索服務(wù)時,面臨的主要問題是:建立合適的數(shù)據(jù)索引,高效的搜索語句,數(shù)據(jù)實時同步。對于前兩個問題,需要根據(jù)業(yè)務(wù)場景設(shè)計相應(yīng)的mapping和search語句,這是個不斷調(diào)優(yōu)的過程。對于數(shù)據(jù)實時同步,可以通過監(jiān)聽Mysql的binlog,并利用消息隊列將數(shù)據(jù)同步到Elasticsearch中。
5、監(jiān)控與日志
為了實時監(jiān)控線上業(yè)務(wù),在業(yè)務(wù)異常時快速定位問題,并對用戶行為和業(yè)務(wù)日志進行數(shù)據(jù)分析,此時就需要搭建一個日志監(jiān)控系統(tǒng)。基本的功能要求是對分散在各處的日志進行收集,集中管理,支持實時搜索,分析以及可視化。推薦使用ELK組合( Elasticsearch + Logstash + Kibana),由Logstash對日志記錄進行采集,然后利用消息隊列將數(shù)據(jù)傳輸?shù)紼lasticsearch中進行存儲,最后通過Kibana對數(shù)據(jù)進行可視化分析。當(dāng)用戶日志數(shù)據(jù)量很大的時候,可以通過優(yōu)化消息隊列,增加數(shù)據(jù)存儲節(jié)點來解決。
如今SaaS平臺數(shù)量越來越多,由于業(yè)務(wù)不同,面臨的問題也各種各樣,處理的方式也各有千秋。希望能通過此次的經(jīng)驗分享,為大家在解決問題時帶來一些思路。