W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
核心內容:58同城流量從小到大過程中,架構是如何演進的?遇到了哪些問題?以及如何解決這些問題?
核心觀點:好的架構不是設計出來的,而是進化而來的。
如何演進:站點流量在不同階段,會遇到不同的問題,找到對應階段站點架構所面臨的主要問題,在不斷解決這些問題的過程中,整個系統(tǒng)的架構就不斷的演進了。
如何演進,簡言之:找到主要矛盾,并解決主要矛盾。
建站之初,站點流量非常小,可能低于十萬級別。這意味著,平均每秒鐘也就幾次訪問。請求量比較低,數據量比較小,代碼量也比較小,幾個工程師,很短的時間搭起這樣的系統(tǒng),甚至沒有考慮“架構”的問題。
這是一個單機系統(tǒng),所有的站點、數據庫、文件都部署在一臺服務器上。工程師每天的核心工作是CURD,瀏覽器端傳過來一些數據,解析GET/POST/COOKIE中傳過來的數據,拼裝成一些CURD的sql語句訪問數據庫,數據庫返回數據,拼裝成頁面,返回瀏覽器。相信很多創(chuàng)業(yè)團隊的工程師,初期做的也是類似的工作。
58同城最初選擇的是微軟技術體系這條路:Windows、iis、SQL-Sever、C#
如果重新再來,我們可能會選擇LAMP體系。
初創(chuàng)階段,工程師面臨的主要問題:寫CURD的sql語句很容易出錯。
我們在這個階段引進DAO和ORM,讓工程師們不再直接面對CURD的sql語句,而是面對他們比較擅長的面向對象開發(fā),極大的提高了編碼效率,降低了出錯率。
隨著流量越來越大,老板不只要求“有一個可以看見的站點”,他希望網站能夠正常訪問,當然速度快點就更好了。
而此時系統(tǒng)面臨問題是:流量的高峰期容易宕機,大量的請求會壓到數據庫上,數據庫成為新的瓶頸,人多并行訪問時站點非???。這時,我們的機器數量也從一臺變成了多臺,我們的系統(tǒng)成了所謂的(偽)“分布式架構”:
我們使用了一些常見優(yōu)化手段:
(1)動靜分離,動態(tài)的頁面通過Web-Server訪問,靜態(tài)的文件例如圖片就放到單獨的文件服務器上;
(2)讀寫分離,將落到數據庫上的讀寫請求分派到不同的數據庫服務器上;
互聯(lián)網絕大部分的業(yè)務場景,都是讀多寫少。對58同城來說,絕大部分用戶的需求是訪問信息,搜索信息,只有少數的用戶發(fā)貼。此時讀取性能容易成為瓶頸,那么如何擴展整個站點架構的讀性能呢?常用的方法是主從同步,增加從庫。我們原來只有一個讀數據庫,現在有多個讀數據庫,就提高了讀性能。
要解決耦合的問題,最先想到的是針對核心業(yè)務做切分,工程師根據業(yè)務切分對系統(tǒng)也進行切分:我們將業(yè)務垂直拆分成了首頁、發(fā)布頁、列表頁和詳情頁。
另外,我們在數據庫層面也進行了垂直拆分,將單庫數據量降下來,讓讀寫延時得到緩解。
同時,還使用了這些技術來優(yōu)化系統(tǒng)和提高研發(fā)效率:
(1)對動態(tài)資源和靜態(tài)資源進行拆分。對靜態(tài)資源我們使用了CDN服務,用戶就近訪問,靜態(tài)資源的訪問速度得到很明顯的提升;
(2)除此之外,我們還使用了MVC模式,擅長前端的工程師去做展示層,擅長業(yè)務邏輯的工程師就做控制層,擅長數據的工程師就做數據層,專人專用,研發(fā)效率和質量又進一步提高。
流量越來越大,當流量達到百萬甚至千萬時,站點面臨一個很大的問題就是性能和成本的折衷。上文提到58同城最初的技術選型是Windows,我們在這個階段做了一次脫胎換骨的技術轉型,全面轉向開源技術:
(1)操作系統(tǒng)轉型Linux
(2)數據庫轉型Mysql
(3)web服務器轉型Tomcat
(4)開發(fā)語言轉向了Java
其實,很多互聯(lián)網公司在流量從小到大的過程中都經歷過類似的轉型,例如京東和淘寶。
除此之外,為了保證站點的高可用,我們使用了反向代理。
什么是代理?代理就是代表用戶訪問xxoo站點。
什么是反向代理?反向代理代表的是58網站,用戶不用關注訪問是58同城的哪臺服務器,由反向代理來代表58同城。58同城通過反向代理,DNS輪詢, LVS等技術,來保證接入層的高可用性。
另外,為了保證服務層和數據層的高可用,我們采用了冗余的方法,單點服務不可用,我們就冗余服務,單點數據不可用,我們就冗余數據。
這個階段58同城進入了一個業(yè)務高速爆發(fā)期,短期內衍生出非常多的業(yè)務站點和服務。新增站點、新增服務每次都會做一些重復的事情,例如線程模型,消息隊列,參數解析等等,于是,58同城就研發(fā)了自己的站點框架和服務框架,現在這兩個框架也都已經開源:
(1)站點框架Argo:https://github.com/58code/Argo
(2)服務框架Gaea:https://github.com/58code/Gaea
現在,58同城的流量已經達到10億的量級,架構上我們規(guī)劃做一些什么樣的事情呢,幾個方向:
(1)業(yè)務服務化
(2)多架構模式
(3)平臺化
(4)...
最后做一個簡單的總結,網站在不同的階段遇到的問題不一樣,而解決這些問題使用的技術也不一樣:
(1)流量小的時候,我們要提高開發(fā)效率,可以在早期要引入ORM,DAO;
(2)流量變大,可以使用動靜分離、讀寫分離、主從同步、垂直拆分、CDN、MVC等方式不斷提升網站的性能和研發(fā)效率;
(3)面對更大的流量時,通過垂直拆分、服務化、反向代理、開發(fā)框架(站點/服務)等等手段,可以不斷提升高可用(研發(fā)效率);
(4)在面對上億級的流量時,通過配置中心、柔性服務、消息總線、自動化(回歸,測試,運維,監(jiān)控)來迎接新的挑戰(zhàn);
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: