① 國內比較好的web前端技術社區有哪些
一直想寫這篇“十日談”,聊聊我對Web前端開發的體會,順便解答下周圍不少人的困惑和迷惘。我不打算聊太多技術,我想,通過技術的歷練,得到的反思應當更重要。 我一直認為自己是“初級”前端開發工程師,一方面我入道尚淺,只有短短幾年,另一方面我自知對技術的鑽研並不深入,可能是由於環境的原因,當然最重要的是,我幸運的參與到互聯網崛起的浪潮之巔。時勢造就了一批技能薄弱但備受追捧的“弄潮者”,這在很大程度上影響我們對“技術本質”的洞察力,多年來也一直未有成體系的“前端技術”佈道佳作,以至於當下多數人對前端技術的了解,蓋始於表述並不嚴謹的崗位招聘描述,而這正恰恰反映了Web前端開發對自身的模糊定位。對於很多Web前端工程師來說,初嘗禁果的快感無法持續很久,就陷入一輪又一輪的迷惘,思索自己的職業規劃,試圖尋找到適合自己的成長道路、看清自身技能的瓶頸,尋找突破。但遺憾的是,Web前端技術被廣泛接納時日尚短,沒有多少勵志的成功樣板可供遵循。然而情況不總是這么糟,畢竟Web前端技術是一門“技術”,和計算機科學系出同門,只是因為互聯網的高速崛起而被蒙上了迷霧,遮住了雙眼,讓我們傻傻看不清時局。 那麼,如何定義Web前端技術崗位邊界?Web前端技術的價值體現在何處?前端工程師的價值僅僅體現在物以稀為貴嗎?前端工程師的初級、中級、高級和專家之間到底如何界定?當前“我”處在什麼位置?接下來的路子應當怎樣走?何謂前端技術之“道”?我想多數人都思考過這些問題,本篇“十日談”里的觀點可能有些偏激,但拋磚引玉,讀者權且把這些言論當作一個引子吧。 第一日:初嘗禁果 【上帝說:“要有光!”便有了光】 萬物生靈、陽光雨露蓋源於造物之初的天工開物,我們無法想像上帝創造光明之前的世界模樣。但幸運的是,前端開發沒有神祗般的詭魅。這個技術工種的孕育、定型、發展自有軌跡,也頗有淵源,當然,這非常容易理解。不嚴格的講,在楊致遠和費羅在斯坦福大學的機房裡攛掇出Yahoo!時,Web前端技術就已經開始進入公眾視野,只不過當時沒有一個響亮的名字。從那時起,“基於瀏覽器端的開發”就成了軟體開發的新的分支,這也是Web前端技術的核心,即不論何時何地何種系統以及怎樣的設備,但凡基於瀏覽器,都是Web前端開發的范疇(當然,這個定義很狹隘,下文會提到)。 在2000年之後瀏覽器技術漸漸成熟,Web產品也越來越豐富,中國有大批年輕人開始接觸互聯網,有一點需要注意,大部分人接觸互聯網不是始於對瀏覽器功能的好奇,而是被瀏覽器窗口內的豐富內容所吸引,我們的思維模式從一開始就被限制在一個小窗口之內,以至於很長時間內我們將“視覺”認為是一種“功能”,Web產品無非是用來展現信息之用。起初的入行者無一例外對“視覺”的關注超過了對“內容”的重視,先讓頁面看起來漂亮,去關注html/css,沿著“視覺呈現”的思路,繼續深入下去。因此,這類人是被“視覺”所吸引,從切頁面入行,著迷於結構化的html和書寫工整的css,喜歡簡潔優雅的UI 和工整的頁面設計,之後開始接觸視覺特效,並使用jQuery來實現視覺特效,以此為線索,開始深入研究Dom、Bom和瀏覽器的渲染機制等,html/css在這些人手中就像進攻兵器,而JavaScript則更如防守的盾牌。 還有另外一群人從另一條道路接觸Web前端,即工程師轉行做前端,他們有較多的後台語言開發背景,從讀寫數據開始,漸漸觸及瀏覽器端,接觸 JavaScript庫,起初是在html代碼上加js邏輯,後來開始涉及html和css,他們喜歡OO、邏輯清晰、結構悅目的代碼,更關注界面背後的 “程序語言”和數據邏輯。html/css在這些人手中則更像盾牌,而JavaScript更如進攻的兵器。 應當說這兩類人是互補的,他們各自了解瀏覽器本質的一部分,一撥人對渲染引擎了如指掌,另一撥人則將JS引擎奉為至寶,其實任何一部分的優勢發揮出來都能做出精品。大部分前端工程師都能從這兩條淵源中找到自己的影子。但,這兩類人的思維模式和觀點是如此不同,以至於形成了一些不必要的對抗,比如在某些公司,乾脆將Web前端技術一分為二,“切頁面的”和“寫js的”。這樣做看上去明確了分工提高了效率,但他對員工的職業發展帶來巨大傷害。在第二日 “科班秀才”中會有進一步討論。 我應該屬於第二類,即在學校正兒八經的學習C/Java和C#之類,以為大學畢業後能去做ERP軟體、桌面軟體或者進某些通信公司寫TCP/IP相關的程序。校園招聘時選擇了中國雅虎,因為當年(08年)雅虎還是有一點兒名氣,而且我聽說雅虎比較算技術流的公司……自此就上了賊船,一發不可收拾。 在雅虎的這段時間,我有幸接觸到一股正氣凜然的技術流派,也形成了我對前端技術的一些基本看法,這些基本觀點一直影響我至今。 【優雅的學院派】 當年雅虎的技術流派正如日中天,擁有眾多“之父”級的高人,所營造出的Hack氛圍實在讓人陶醉的無法自拔,那段時間我甚至寧願加班到深夜閱讀海量的文檔和源代碼,感覺真的很舒服,我深深的被雅虎工程師這種低調務實、精工細琢的“服務精神”所打動,而這種不起眼的優秀品質很大程度的影響雅虎產品的用戶體驗和高質量的技術輸出。那麼,何謂“服務精神”?即你所做的東西是服務於人的,要麼是產品客戶、要麼是接手你項目的人、要麼是使用你開發的功能的人,所以技術文檔成為伴隨代碼的標配。因此,工程師之間通過代碼就能做到心有靈犀的溝通。這是工程師的一項基本素質,即,思路清晰的完成項目,且配備了有價值的技術文檔,如果你的程序是給其他程序員用的,則更要如此,就好比你製造一款家電都要配備說明書一樣。因此,YDN成了當時最受全球程序員最喜愛的技術文檔庫,這種優雅務實的“學院氣息”讓人感覺獨具魅力。 讓人感覺奇怪的是,在中文社區始終未見這種學院派。甚至在具有先天開源優勢的Web前端技術社區里也是波瀾不驚,可見寫一篇好的技術文案真的比登天還難。我所見到的大部分所謂文檔索性把代碼里輸出數據的語句塊拷貝粘貼出來,至於為什麼數據格式要設計成這樣、如果欄位有修改怎麼做、編碼解碼要求如何等等關鍵信息隻字不提,或者開發者也沒想過這些問題呢。因此,我們一直在強調代碼的質量和可維護性,但一直以來都未見效,蓋源於缺少這種“服務”意識的灌輸。這種意識在下文中還會多次提到,因為它能影響你做事的每個細節,是最應當首先突破的思想糾結。 除了意識問題,另一方面是技術問題,即文筆。這也是工程師最瞧不上眼的問題,難以置信這竟然是阻礙工程師突破瓶頸的關鍵所在。我已看到過數不清的人在晉升這道關卡吃了大虧,很多工程師技術實力很強,但就是表達不出來,要麼羅列一大堆信息毫無重點、要麼毫無趣味的講代碼細節,不知雲雲。除非你走狗屎運碰到一個懂技術的老闆,否則真的沒辦法逃脫碼農的宿命。但大部分人還振振有詞不以為然。而在Web前端開發領域情況更甚。前端工程師是最喜歡搞重構的,但在快節奏的需求面前,你很難用“提高了可維護性”、“提升了性能”這類虛無縹緲的詞藻為自己爭取到時間來搞重構,說的露骨一點,可能你真的對某次重構帶來的實際價值無法量化,只是“感覺代碼更整潔了”而已。我會在下文的“偽架構”中會分析前端工程師的這種浮躁獻媚的技術情結。而這正是前端工程師最欠缺的素質之一:用數據說話,用嚴謹科學的論據來支撐你的觀點,老闆不傻,有價值的東西當然會讓你去做。 當然,情況不總是這么糟糕,我們看到中文社區中已經鍛煉出了很多寫手,他們在用高質量的文字推銷自己的技術理念,這是一個好兆頭,好的文筆是可以鍛煉出來的。而在職場,特別是對前端工程師這個特殊職位來講,這種基本技能可以幫你反思梳理需求的輕重緩急,從凌亂的需求中把握七寸所在。因為當你開始認真寫一封郵件的時候,這種思考已經包含其中了。 所以,雅虎技術的推銷是相對成功和遠播的。關鍵在於兩方面,扎實的技術功底和高超的寫手。而真正的技術大牛一定是集兩者與一身,不僅鑽研劍道,還能產出秘籍。這也是Yahoo!優雅的學院派氣息的動力源泉。國內很多技術團體想在這方面有所建樹,應當首先想清楚這一點。 【規范的破與立 1】 雅虎的技術運作非常規范,剛才已經提到,包括技術、組織、文化,一切看起來有模有樣,也堪稱標桿,自然成了國內很多技術團隊和社區的效仿對象。一時間各種“規范“成風、各色“標准“大行其道,結果是質量參差不齊。 我們到底需要什麼樣的規范?雅虎的技術規范到底有何種魔力?以何種思路構建的規范才是貨真價實的?規范有著怎樣的生命周期?想清楚這些問題,能很大程度減輕很多Web前端工程師的思想負擔,看清一部分技術本質,避免盲目跟風。
② web前端大牛們當年是如何入門的
每個前端大牛,都是從當初的「菜鳥」成長過來的,並沒有什麼捷徑可言。在這里,小編可以為題主提供一個大概的Web前端學習思路。希望能對你有所幫助~
1. HTML5 + CSS3 + JavaScript
Web開發基礎中的基礎,HTML是負責網頁結構,CSS負責網頁樣式,JS則負責邏輯交互。前兩者更像是標記語言,沒有什麼邏輯,JS才是前端的重中之重。 HTML5 新增的技術大部分需要結合JS學習。
每個人學習進度可能不同,這個階段主要是多仿站,熟悉基礎,試試用CSS寫響應式頁面,了解JS深入性的知識,比如原型鏈、閉包、 設計模式 等需要更多的積累,逐漸理解並實踐掌握。
2. JQuery + BootStrap + Ajax + Json
jQuery是JS的一個應用庫,能夠提升原生JS開發效率。Bootstrap則是響應式框架,更簡單的實現手機/平板/PC多個設備的頁面支持。Ajax技術用於非同步交互,不刷新頁面就能更新數據,比如 地圖 應用等。Json是一種數據格式,被廣泛應用在各大編程語言中。
jQuery 和 bootstrap 會簡化很多編寫的代碼量,用著不亦樂乎,但對於基礎還不是很扎實的人建議還是少用。 Ajax 和 json 通常用於和後端交互,在實際業務中也經常用到。
3. Git/SVN
版本管理工具,主要用於團隊開發時避免文件沖突,也可回檔。前端推薦學習Git。
4. Nodejs + Mysql /MongoDB(可選)
運行在伺服器端的JavaScript。Express是其拓展MVC框架。其中nodejs最常用到的就是npm包管理器,不用到各個網站去下載資源包。 資料庫 的學習可以選擇MongoDB或者MySQL,前者與Nodejs的契合度更好,不過現在大多數網站都是 PHP +Mysql的組合,如果有學PHP的打算的話,可以先學習 Mysql 。
5. ECMAScript 6
JavaScript 的語言標准。ES6中加入了很多新的概念,也彌補了之前版本中JS的很多缺陷,越來越多的項目開始運用ES6進行開發。學之前最好把ES5先搞懂了,目前實際項目中考慮到兼容性,ES6是需要通過Babel將其編譯為ES5來部署的。
6. Angular/React/Vue
前端三大框架,各自也有著各自的生態系統,根據需求自行選擇學習。目前企業需求量最大的仍然是Angular,但近期趨勢來看react和vue則更受歡迎。因為現在前端技術發展太過於突飛猛進,工具和框架的更新比翻書還快,建議學習還是看文檔比較好。學習過程中也會遇到很多用到各種構建工具的時候。
7. 其他常用工具
這個一樣是根據需求自行選擇學習。比較常用的現在有 Web pack,可以將多個不同編程風格的文件打包,比如ES6/AMD/CMD之類的模塊化都能識別並編譯成 瀏覽器 能運行的文件。Sass/Less,CSS預編譯框架,可以用帶有邏輯性的方式編寫CSS代碼。Gulp/Grunt構建工具,可以自動化對代碼進行壓縮合並等工作。
8. 其他後端編程語言
目前市場對前端基本都要求會一門後端語言, PHP / JAVA / Nodejs / Python 等。
學習編程重要的還是實踐,多敲代碼,多去嘗試。獨立解決問題的能力、探究鑽研的精神是必不可少的。有興趣的話也可以自己搭建一個技術 博客 ,往 github 上傳幾個 開源 項目,這些都是不錯的加分點。
③ 國內有哪些前端開發牛人
目前隨著科技的發展,國家的進步,各行各樣涌現出了許許多多的人才與前段開發牛人
今天就介紹一些行業的前段開發牛人
:還有#@just.jayac到他的關於頁面,很有Geek風格總之,現在的前段牛人各行各業都有很多了。不僅僅只是限於騰訊與淘寶的科技開發人員了。更多的活躍於flash與游戲領域。只要大家多多發掘,也可以認識許許多多的牛人大神。
④ php怎麼處理高並發
以下內容轉載自徐漢彬大牛的博客億級Web系統搭建——單機到分布式集群
當一個Web系統從日訪問量10萬逐步增長到1000萬,甚至超過1億的過程中,Web系統承受的壓力會越來越大,在這個過程中,我們會遇到很多的問題。為了解決這些性能壓力帶來問題,我們需要在Web系統架構層面搭建多個層次的緩存機制。在不同的壓力階段,我們會遇到不同的問題,通過搭建不同的服務和架構來解決。
Web負載均衡
Web負載均衡(Load Balancing),簡單地說就是給我們的伺服器集群分配「工作任務」,而採用恰當的分配方式,對於保護處於後端的Web伺服器來說,非常重要。
負載均衡的策略有很多,我們從簡單的講起哈。
1.HTTP重定向
當用戶發來請求的時候,Web伺服器通過修改HTTP響應頭中的Location標記來返回一個新的url,然後瀏覽器再繼續請求這個新url,實際上就是頁面重定向。通過重定向,來達到「負載均衡」的目標。例如,我們在下載PHP源碼包的時候,點擊下載鏈接時,為了解決不同國家和地域下載速度的問題,它會返回一個離我們近的下載地址。重定向的HTTP返回碼是302
這個重定向非常容易實現,並且可以自定義各種策略。但是,它在大規模訪問量下,性能不佳。而且,給用戶的體驗也不好,實際請求發生重定向,增加了網路延時。
2. 反向代理負載均衡
反向代理服務的核心工作主要是轉發HTTP請求,扮演了瀏覽器端和後台Web伺服器中轉的角色。因為它工作在HTTP層(應用層),也就是網路七層結構中的第七層,因此也被稱為「七層負載均衡」。可以做反向代理的軟體很多,比較常見的一種是Nginx。
Nginx是一種非常靈活的反向代理軟體,可以自由定製化轉發策略,分配伺服器流量的權重等。反向代理中,常見的一個問題,就是Web伺服器存儲的session數據,因為一般負載均衡的策略都是隨機分配請求的。同一個登錄用戶的請求,無法保證一定分配到相同的Web機器上,會導致無法找到session的問題。
解決方案主要有兩種:
1.配置反向代理的轉發規則,讓同一個用戶的請求一定落到同一台機器上(通過分析cookie),復雜的轉發規則將會消耗更多的CPU,也增加了代理伺服器的負擔。
2.將session這類的信息,專門用某個獨立服務來存儲,例如redis/memchache,這個方案是比較推薦的。
反向代理服務,也是可以開啟緩存的,如果開啟了,會增加反向代理的負擔,需要謹慎使用。這種負載均衡策略實現和部署非常簡單,而且性能表現也比較好。但是,它有「單點故障」的問題,如果掛了,會帶來很多的麻煩。而且,到了後期Web伺服器繼續增加,它本身可能成為系統的瓶頸。
3. IP負載均衡
IP負載均衡服務是工作在網路層(修改IP)和傳輸層(修改埠,第四層),比起工作在應用層(第七層)性能要高出非常多。原理是,他是對IP層的數據包的IP地址和埠信息進行修改,達到負載均衡的目的。這種方式,也被稱為「四層負載均衡」。常見的負載均衡方式,是LVS(Linux Virtual Server,Linux虛擬服務),通過IPVS(IP Virtual Server,IP虛擬服務)來實現。
在負載均衡伺服器收到客戶端的IP包的時候,會修改IP包的目標IP地址或埠,然後原封不動地投遞到內部網路中,數據包會流入到實際Web伺服器。實際伺服器處理完成後,又會將數據包投遞回給負載均衡伺服器,它再修改目標IP地址為用戶IP地址,最終回到客戶端。
上述的方式叫LVS-NAT,除此之外,還有LVS-RD(直接路由),LVS-TUN(IP隧道),三者之間都屬於LVS的方式,但是有一定的區別,篇幅問題,不贅敘。
IP負載均衡的性能要高出Nginx的反向代理很多,它只處理到傳輸層為止的數據包,並不做進一步的組包,然後直接轉發給實際伺服器。不過,它的配置和搭建比較復雜。
4. DNS負載均衡
DNS(Domain Name System)負責域名解析的服務,域名url實際上是伺服器的別名,實際映射是一個IP地址,解析過程,就是DNS完成域名到IP的映射。而一個域名是可以配置成對應多個IP的。因此,DNS也就可以作為負載均衡服務。
這種負載均衡策略,配置簡單,性能極佳。但是,不能自由定義規則,而且,變更被映射的IP或者機器故障時很麻煩,還存在DNS生效延遲的問題。
5. DNS/GSLB負載均衡
我們常用的CDN(Content Delivery Network,內容分發網路)實現方式,其實就是在同一個域名映射為多IP的基礎上更進一步,通過GSLB(Global Server Load Balance,全局負載均衡)按照指定規則映射域名的IP。一般情況下都是按照地理位置,將離用戶近的IP返回給用戶,減少網路傳輸中的路由節點之間的跳躍消耗。
「向上尋找」,實際過程是LDNS(Local DNS)先向根域名服務(Root Name Server)獲取到頂級根的Name Server(例如.com的),然後得到指定域名的授權DNS,然後再獲得實際伺服器IP。
CDN在Web系統中,一般情況下是用來解決大小較大的靜態資源(html/Js/Css/圖片等)的載入問題,讓這些比較依賴網路下載的內容,盡可能離用戶更近,提升用戶體驗。
例如,我訪問了一張imgcache.gtimg.cn上的圖片(騰訊的自建CDN,不使用qq.com域名的原因是防止http請求的時候,帶上了多餘的cookie信息),我獲得的IP是183.60.217.90。
這種方式,和前面的DNS負載均衡一樣,不僅性能極佳,而且支持配置多種策略。但是,搭建和維護成本非常高。互聯網一線公司,會自建CDN服務,中小型公司一般使用第三方提供的CDN。
Web系統的緩存機制的建立和優化
剛剛我們講完了Web系統的外部網路環境,現在我們開始關注我們Web系統自身的性能問題。我們的Web站點隨著訪問量的上升,會遇到很多的挑戰,解決這些問題不僅僅是擴容機器這么簡單,建立和使用合適的緩存機制才是根本。
最開始,我們的Web系統架構可能是這樣的,每個環節,都可能只有1台機器。
我們從最根本的數據存儲開始看哈。
一、 MySQL資料庫內部緩存使用
MySQL的緩存機制,就從先從MySQL內部開始,下面的內容將以最常見的InnoDB存儲引擎為主。
1. 建立恰當的索引
最簡單的是建立索引,索引在表數據比較大的時候,起到快速檢索數據的作用,但是成本也是有的。首先,佔用了一定的磁碟空間,其中組合索引最突出,使用需要謹慎,它產生的索引甚至會比源數據更大。其次,建立索引之後的數據insert/update/delete等操作,因為需要更新原來的索引,耗時會增加。當然,實際上我們的系統從總體來說,是以select查詢操作居多,因此,索引的使用仍然對系統性能有大幅提升的作用。
2. 資料庫連接線程池緩存
如果,每一個資料庫操作請求都需要創建和銷毀連接的話,對資料庫來說,無疑也是一種巨大的開銷。為了減少這類型的開銷,可以在MySQL中配置thread_cache_size來表示保留多少線程用於復用。線程不夠的時候,再創建,空閑過多的時候,則銷毀。
其實,還有更為激進一點的做法,使用pconnect(資料庫長連接),線程一旦創建在很長時間內都保持著。但是,在訪問量比較大,機器比較多的情況下,這種用法很可能會導致「資料庫連接數耗盡」,因為建立連接並不回收,最終達到資料庫的max_connections(最大連接數)。因此,長連接的用法通常需要在CGI和MySQL之間實現一個「連接池」服務,控制CGI機器「盲目」創建連接數。
建立資料庫連接池服務,有很多實現的方式,PHP的話,我推薦使用swoole(PHP的一個網路通訊拓展)來實現。
3. Innodb緩存設置(innodb_buffer_pool_size)
innodb_buffer_pool_size這是個用來保存索引和數據的內存緩存區,如果機器是MySQL獨占的機器,一般推薦為機器物理內存的80%。在取表數據的場景中,它可以減少磁碟IO。一般來說,這個值設置越大,cache命中率會越高。
4. 分庫/分表/分區。
MySQL資料庫表一般承受數據量在百萬級別,再往上增長,各項性能將會出現大幅度下降,因此,當我們預見數據量會超過這個量級的時候,建議進行分庫/分表/分區等操作。最好的做法,是服務在搭建之初就設計為分庫分表的存儲模式,從根本上杜絕中後期的風險。不過,會犧牲一些便利性,例如列表式的查詢,同時,也增加了維護的復雜度。不過,到了數據量千萬級別或者以上的時候,我們會發現,它們都是值得的。
二、 MySQL資料庫多台服務搭建
1台MySQL機器,實際上是高風險的單點,因為如果它掛了,我們Web服務就不可用了。而且,隨著Web系統訪問量繼續增加,終於有一天,我們發現1台MySQL伺服器無法支撐下去,我們開始需要使用更多的MySQL機器。當引入多台MySQL機器的時候,很多新的問題又將產生。
1. 建立MySQL主從,從庫作為備份
這種做法純粹為了解決「單點故障」的問題,在主庫出故障的時候,切換到從庫。不過,這種做法實際上有點浪費資源,因為從庫實際上被閑著了。
2. MySQL讀寫分離,主庫寫,從庫讀。
兩台資料庫做讀寫分離,主庫負責寫入類的操作,從庫負責讀的操作。並且,如果主庫發生故障,仍然不影響讀的操作,同時也可以將全部讀寫都臨時切換到從庫中(需要注意流量,可能會因為流量過大,把從庫也拖垮)。
3. 主主互備。
兩台MySQL之間互為彼此的從庫,同時又是主庫。這種方案,既做到了訪問量的壓力分流,同時也解決了「單點故障」問題。任何一台故障,都還有另外一套可供使用的服務。
不過,這種方案,只能用在兩台機器的場景。如果業務拓展還是很快的話,可以選擇將業務分離,建立多個主主互備。
三、 MySQL資料庫機器之間的數據同步
每當我們解決一個問題,新的問題必然誕生在舊的解決方案上。當我們有多台MySQL,在業務高峰期,很可能出現兩個庫之間的數據有延遲的場景。並且,網路和機器負載等,也會影響數據同步的延遲。我們曾經遇到過,在日訪問量接近1億的特殊場景下,出現,從庫數據需要很多天才能同步追上主庫的數據。這種場景下,從庫基本失去效用了。
於是,解決同步問題,就是我們下一步需要關注的點。
1. MySQL自帶多線程同步
MySQL5.6開始支持主庫和從庫數據同步,走多線程。但是,限制也是比較明顯的,只能以庫為單位。MySQL數據同步是通過binlog日誌,主庫寫入到binlog日誌的操作,是具有順序的,尤其當SQL操作中含有對於表結構的修改等操作,對於後續的SQL語句操作是有影響的。因此,從庫同步數據,必須走單進程。
2. 自己實現解析binlog,多線程寫入。
以資料庫的表為單位,解析binlog多張表同時做數據同步。這樣做的話,的確能夠加快數據同步的效率,但是,如果表和表之間存在結構關系或者數據依賴的話,則同樣存在寫入順序的問題。這種方式,可用於一些比較穩定並且相對獨立的數據表。
國內一線互聯網公司,大部分都是通過這種方式,來加快數據同步效率。還有更為激進的做法,是直接解析binlog,忽略以表為單位,直接寫入。但是這種做法,實現復雜,使用范圍就更受到限制,只能用於一些場景特殊的資料庫中(沒有表結構變更,表和表之間沒有數據依賴等特殊表)。
四、 在Web伺服器和資料庫之間建立緩存
實際上,解決大訪問量的問題,不能僅僅著眼於資料庫層面。根據「二八定律」,80%的請求只關注在20%的熱點數據上。因此,我們應該建立Web伺服器和資料庫之間的緩存機制。這種機制,可以用磁碟作為緩存,也可以用內存緩存的方式。通過它們,將大部分的熱點數據查詢,阻擋在資料庫之前。
1. 頁面靜態化
用戶訪問網站的某個頁面,頁面上的大部分內容在很長一段時間內,可能都是沒有變化的。例如一篇新聞報道,一旦發布幾乎是不會修改內容的。這樣的話,通過CGI生成的靜態html頁面緩存到Web伺服器的磁碟本地。除了第一次,是通過動態CGI查詢資料庫獲取之外,之後都直接將本地磁碟文件返回給用戶。
在Web系統規模比較小的時候,這種做法看似完美。但是,一旦Web系統規模變大,例如當我有100台的Web伺服器的時候。那樣這些磁碟文件,將會有100份,這個是資源浪費,也不好維護。這個時候有人會想,可以集中一台伺服器存起來,呵呵,不如看看下面一種緩存方式吧,它就是這樣做的。
2. 單台內存緩存
通過頁面靜態化的例子中,我們可以知道將「緩存」搭建在Web機器本機是不好維護的,會帶來更多問題(實際上,通過PHP的apc拓展,可通過Key/value操作Web伺服器的本機內存)。因此,我們選擇搭建的內存緩存服務,也必須是一個獨立的服務。
內存緩存的選擇,主要有redis/memcache。從性能上說,兩者差別不大,從功能豐富程度上說,Redis更勝一籌。
3. 內存緩存集群
當我們搭建單台內存緩存完畢,我們又會面臨單點故障的問題,因此,我們必須將它變成一個集群。簡單的做法,是給他增加一個slave作為備份機器。但是,如果請求量真的很多,我們發現cache命中率不高,需要更多的機器內存呢?因此,我們更建議將它配置成一個集群。例如,類似redis cluster。
Redis cluster集群內的Redis互為多組主從,同時每個節點都可以接受請求,在拓展集群的時候比較方便。客戶端可以向任意一個節點發送請求,如果是它的「負責」的內容,則直接返回內容。否則,查找實際負責Redis節點,然後將地址告知客戶端,客戶端重新請求。
對於使用緩存服務的客戶端來說,這一切是透明的。
內存緩存服務在切換的時候,是有一定風險的。從A集群切換到B集群的過程中,必須保證B集群提前做好「預熱」(B集群的內存中的熱點數據,應該盡量與A集群相同,否則,切換的一瞬間大量請求內容,在B集群的內存緩存中查找不到,流量直接沖擊後端的資料庫服務,很可能導致資料庫宕機)。
4. 減少資料庫「寫」
上面的機制,都實現減少資料庫的「讀」的操作,但是,寫的操作也是一個大的壓力。寫的操作,雖然無法減少,但是可以通過合並請求,來起到減輕壓力的效果。這個時候,我們就需要在內存緩存集群和資料庫集群之間,建立一個修改同步機制。
先將修改請求生效在cache中,讓外界查詢顯示正常,然後將這些sql修改放入到一個隊列中存儲起來,隊列滿或者每隔一段時間,合並為一個請求到資料庫中更新資料庫。
除了上述通過改變系統架構的方式提升寫的性能外,MySQL本身也可以通過配置參數innodb_flush_log_at_trx_commit來調整寫入磁碟的策略。如果機器成本允許,從硬體層面解決問題,可以選擇老一點的RAID(Rendant Arrays of independent Disks,磁碟列陣)或者比較新的SSD(Solid State Drives,固態硬碟)。
5. NoSQL存儲
不管資料庫的讀還是寫,當流量再進一步上漲,終會達到「人力有窮時」的場景。繼續加機器的成本比較高,並且不一定可以真正解決問題的時候。這個時候,部分核心數據,就可以考慮使用NoSQL的資料庫。NoSQL存儲,大部分都是採用key-value的方式,這里比較推薦使用上面介紹過Redis,Redis本身是一個內存cache,同時也可以當做一個存儲來使用,讓它直接將數據落地到磁碟。
這樣的話,我們就將資料庫中某些被頻繁讀寫的數據,分離出來,放在我們新搭建的Redis存儲集群中,又進一步減輕原來MySQL資料庫的壓力,同時因為Redis本身是個內存級別的Cache,讀寫的性能都會大幅度提升。
國內一線互聯網公司,架構上採用的解決方案很多是類似於上述方案,不過,使用的cache服務卻不一定是Redis,他們會有更豐富的其他選擇,甚至根據自身業務特點開發出自己的NoSQL服務。
6. 空節點查詢問題
當我們搭建完前面所說的全部服務,認為Web系統已經很強的時候。我們還是那句話,新的問題還是會來的。空節點查詢,是指那些資料庫中根本不存在的數據請求。例如,我請求查詢一個不存在人員信息,系統會從各級緩存逐級查找,最後查到到資料庫本身,然後才得出查找不到的結論,返回給前端。因為各級cache對它無效,這個請求是非常消耗系統資源的,而如果大量的空節點查詢,是可以沖擊到系統服務的。
在我曾經的工作經歷中,曾深受其害。因此,為了維護Web系統的穩定性,設計適當的空節點過濾機制,非常有必要。
我們當時採用的方式,就是設計一張簡單的記錄映射表。將存在的記錄存儲起來,放入到一台內存cache中,這樣的話,如果還有空節點查詢,則在緩存這一層就被阻擋了。
異地部署(地理分布式)
完成了上述架構建設之後,我們的系統是否就已經足夠強大了呢?答案當然是否定的哈,優化是無極限的。Web系統雖然表面上看,似乎比較強大了,但是給予用戶的體驗卻不一定是最好的。因為東北的同學,訪問深圳的一個網站服務,他還是會感到一些網路距離上的慢。這個時候,我們就需要做異地部署,讓Web系統離用戶更近。
一、 核心集中與節點分散
有玩過大型網游的同學都會知道,網游是有很多個區的,一般都是按照地域來分,例如廣東專區,北京專區。如果一個在廣東的玩家,去北京專區玩,那麼他會感覺明顯比在廣東專區卡。實際上,這些大區的名稱就已經說明了,它的伺服器所在地,所以,廣東的玩家去連接地處北京的伺服器,網路當然會比較慢。
當一個系統和服務足夠大的時候,就必須開始考慮異地部署的問題了。讓你的服務,盡可能離用戶更近。我們前面已經提到了Web的靜態資源,可以存放在CDN上,然後通過DNS/GSLB的方式,讓靜態資源的分散「全國各地」。但是,CDN只解決的靜態資源的問題,沒有解決後端龐大的系統服務還只集中在某個固定城市的問題。
這個時候,異地部署就開始了。異地部署一般遵循:核心集中,節點分散。
·核心集中:實際部署過程中,總有一部分的數據和服務存在不可部署多套,或者部署多套成本巨大。而對於這些服務和數據,就仍然維持一套,而部署地點選擇一個地域比較中心的地方,通過網路內部專線來和各個節點通訊。
·節點分散:將一些服務部署為多套,分布在各個城市節點,讓用戶請求盡可能選擇近的節點訪問服務。
例如,我們選擇在上海部署為核心節點,北京,深圳,武漢,上海為分散節點(上海自己本身也是一個分散節點)。我們的服務架構如圖:
需要補充一下的是,上圖中上海節點和核心節點是同處於一個機房的,其他分散節點各自獨立機房。
國內有很多大型網游,都是大致遵循上述架構。它們會把數據量不大的用戶核心賬號等放在核心節點,而大部分的網游數據,例如裝備、任務等數據和服務放在地區節點里。當然,核心節點和地域節點之間,也有緩存機制。
二、 節點容災和過載保護
節點容災是指,某個節點如果發生故障時,我們需要建立一個機制去保證服務仍然可用。毫無疑問,這里比較常見的容災方式,是切換到附近城市節點。假如系統的天津節點發生故障,那麼我們就將網路流量切換到附近的北京節點上。考慮到負載均衡,可能需要同時將流量切換到附近的幾個地域節點。另一方面,核心節點自身也是需要自己做好容災和備份的,核心節點一旦故障,就會影響全國服務。
過載保護,指的是一個節點已經達到最大容量,無法繼續接接受更多請求了,系統必須有一個保護的機制。一個服務已經滿負載,還繼續接受新的請求,結果很可能就是宕機,影響整個節點的服務,為了至少保障大部分用戶的正常使用,過載保護是必要的。
解決過載保護,一般2個方向:
·拒絕服務,檢測到滿負載之後,就不再接受新的連接請求。例如網游登入中的排隊。
·分流到其他節點。這種的話,系統實現更為復雜,又涉及到負載均衡的問題。
小結
Web系統會隨著訪問規模的增長,漸漸地從1台伺服器可以滿足需求,一直成長為「龐然大物」的大集群。而這個Web系統變大的過程,實際上就是我們解決問題的過程。在不同的階段,解決不同的問題,而新的問題又誕生在舊的解決方案之上。
系統的優化是沒有極限的,軟體和系統架構也一直在快速發展,新的方案解決了老的問題,同時也帶來新的挑戰。
⑤ 前端工程師經常上哪些網站學習最新技術
Gank干貨集中營
這個的用戶群更加偏向於Android/iOS客戶端開發者,不過有個匠心寫作,可以稍微關注下。
Hacker News
我覺得這個不用我介紹了吧。。。不知道的自己搜一下就知道了。
2.BAT等等國內有名公司前端團隊的博客
Web前端 騰訊AlloyTeam Blog
前端開發 – 攜程設計委員會
FEX - FEX
奇舞團博客
騰訊ISUX – 社交用戶體驗設計
讓生活支付更完美|TID-財付通設計中心
Aotu.io「凹凸實驗室」
EFE Tech - 網路EFE(Excellent FrontEnd)技術體系
GitHub - gomeplusFED/blog: blog
這類博客背後都是一群牛逼的團隊在維護,一般質量不會低,你的技術基礎的內容沒有問題 達到一定的水平了 可以來次參考學習一下
⑥ 有哪些質量上乘的程序員必關注的網站或論壇
1、CSDN:專業IT技術社區,包含原創博客、精品問答、職業培訓、技術論壇、資源下載等產品服務,這個經久不衰的社區是程序員發表自己作品和看法的大本營;
GitHub社區
⑦ 國內web前端大神級人物有哪些人(博客名、網名、真名)
阮一峰,司徒正美
⑧ 程序員,你們經常逛的網站有哪些
淘寶 亞馬遜 小紅書 網易考拉
雖然我是程序猿 可是我還是要買口紅啊= =
⑨ 目前比較火的web前端 論壇和博客有哪些
目前比較火的論壇博客有哪些? 這里收集一些比較好的技術開發者社區供大家參考,具體如下:
1、快速開發平台社區 -天翎論壇,主要是以Java低代碼開發平台為主的技術性論壇社區,目前低代碼平台商用授權對外開放;
2、CSDN -專業開發者社區 IT技術交流平台;
3、IT圈,圈圈精彩 - 原軟媒論壇、IT之家,國內最人氣的科技社交圈層,繼軟媒論壇、IT之家社區演變而來;
4、51CTO技術論壇-中國領先的IT技術社區 國內主流IT技術社區,論壇擁有大批IT技術人/IT專家;
5、ITPUB技術論壇-中國專業的IT技術社區。