零後端基礎想搭建一個高可用的node服務,需要學習什麼,有什麼比較好的教程或者開源練手項目么?
只用node寫過一些工具,然後用koa、express結合mongodb實現過簡單的博客啊一類的功能,也了解過redis,嘗試用redis做過session的緩存(用戶驗證),但是說到高可用、高並發、內存管理方面還是兩眼一摸黑。有沒有適合零後端基礎的人有關的教程和開源練手項目,能比較好的渡過這一階段?或者說至少能對相關的內容有一個比較全局的認識?
那個匿名太偏激了,軟體工程幾乎全是實踐,那麼教程就沒有用了,對於node而言連一本指方向的教程都沒,而且哪個教程包教包會了,包教包會的是大達內吧。
正式說下問題:1、沒有相關教程(我目前沒見過),教程幾乎全部是入門級的,要麼就是講底層的(朴靈的『九淺一深』和各種源碼分析)。
2、開源的項目源碼,也沒有(目前沒見過),有的基本都是基礎架構類的(eggjs、hapi、sails等),或者是專註某一領域的庫(比如pm2等),要麼就是入門級的項目,目前見過最不入門級的是cnode的egg版。
我之前接觸過Java,以Java為例相關的教程汗牛充棟。
並發相關:分散式:性能相關:最近火的微服務:為什麼會這樣?其實用java跟node比不太公平,不管是歷史還是熱度雙方差距巨大,其實你換成php、python的話也好不到哪裡去(python這數據這塊的教程還是十分豐富的)。
我個人認為除了node歷史太短之外,還有幾個問題。
1、社區人群的組成有些問題,我沒做過調查,我只能說下我的感覺,node幾乎所有的高手們是多年PHP、Java、c/c++轉過來的(別說高手了,水平比較好的也基本是其他後端轉的),我沒見過只會JavaScript的node高手,但是node社區絕大多數人是前端工程師。如果說一個社區正常情況下是金字塔結構的話,node這邊是沒有腰的,底座大量伺服器知識匱乏的前端,頂端一小撮多年經驗的大佬們,大佬們除了維護社區、佈道、本職工作、開源,還特么寫教程,真是難為這一小撮人了,朴靈的第二版書寫到現在還沒出,你總不能靠這一個人輸出吧,那腰部的同學們打怪升級也總有一天可以成為boss的,可惜腰部是幾乎沒得,大佬就這麼多人,總不能給大佬們派任務寫書吧,Java那些海量書是宛如繁星的眾多高手中出的那幾本,node的情況是大佬太少,有機會成為大佬的人也少(腰部開發者)總不能靠前端寫分散式的書吧。
2、node的高並發、分散式這些進階實踐真的多麼?Java可以產生海量的進階書籍,得益於Java作為企業級後台多年的中堅力量積累的實踐總結,你要知道這些書勢必是作者面對此類場景總結得來的,幾乎所有面對c端的Java開發都或多或少遇到並發問題,然而node雖然號稱為高並發而生,除了大量使用node的阿里(這你得問問阿里的node專家了),有幾個公司在大量深度實踐node,沒有海量實踐,不可能有此類的教程/書籍的,畢竟不是《xx實戰》《xx指南》搭個博客、抄抄文檔就能出書了。
最後說下如何實踐、進階,相關教程是沒得,項目是沒得,如果你們公司有一個node大佬願意指點你那最好不過,不過通常也是沒得,絕大部分公司也不會用node作為中堅支撐自己的c端主營業務,實踐機會特么都不多啊。
那怎麼辦?感覺人生都灰暗了,有沒有。
不妨,學習汪主席曲線救國,你要知道你需要學習的是伺服器知識,而不是node,那自然去水土肥沃的地方吸取養分啊,又沒幹爹沒人帶,速來達內學Java,海量教程、海量實踐、海量工作機會,包教包會,反正伺服器端知識80%都是通用的,Java能並發了,用node自然也並發了,Java分布了,node也分布了,大家用的都是mysql和redis,有啥不一樣?然後反哺node社區,什麼《高並發node》、《分散式node設計內幕》、《node性能權威指南》、《node編程思想》來一沓,學費估計都掙回來了。
A computer cluster is a set of loosely or tightly connectedcomputersthat work together so that, in many respects, they can be viewed as a single system.
首先,我們說 HA(高可用) 時通常是指計算機集群(Computer cluster)的高可用性。即一組計算機節點,能夠共同對外服務,使用者可以將他們視為單機。
A single instance of Node.js runs in a single thread. To take advantage of multi-core systems, the user will sometimes want to launch a cluster of Node.js processes to handle the load.
其次,以 Node 官方文檔為例,Cluster 是通過多線程的方式運行以充分利用多核系統的計算能力。
兩者的概念是有差別的,前者通常在架構層面去考慮,並不受限於編程語言。以最常見的 Nginx 為例,Upstream 是一組工作節點,Nginx 作為 Proxy(代理),通過輪訓之類的演算法,輔助以健康檢查(檢測節點是否可用),將請求轉發到後端應用,以實現在部分節點失效時其他節點依然能夠正常響應請求。
upstream upstreams {
server 192.168.0.1:8080;
server 192.168.0.2:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://upstreams;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
在線上運行時,DNS 解析到 Load Balance 所在 IP,由 LB 實現上述的轉發以及對應用進行健康檢查並動態更新後端應用列表。出於性能要求,LB 通常是使用 C語言實現,但我們也可以考慮其他方式,學習過程中,我們要去實現下面的幾部分:
- 前端代理(請求轉發)
- 後端應用(請求響應)
- 健康檢查(動態更新後端應用列表)
當然了,在正式環境中,前端代理(負載均衡)有 HAProxy、Nginx 以及 F5 等,並且每一種方案都有對應的健康檢查機制,理解了其中的概念和作用,在技術選型過程中就可以靈活選擇了(比如成本,F5 很貴...)。
推薦想要學習的同學去看看一些入門級的架構書籍或文章,網上是比較常見的,明白了其中的道道,怎麼實現不過是造輪子還是用輪子的問題。
推薦一個開源項目:
davideuler/architecture.of.internet-product?github.com蘇依蜀黍de小木屋?zhuanlan.zhihu.com
歡迎關注我專欄,不定期更新前端及其他技術實踐。
邊補後端邊實踐,包括但不限於 Go、Java、C++ 和 C(優先順序由高到低)。就和技術債一樣,到後面都要還的。
伺服器端程序員校招:怎樣的實踐經歷才能讓人感覺不錯??www.zhihu.com
軟體開發三個階段,學習階段,應用階段,進階階段,而進階階段里又可以細分很多層,最高一層就是騰訊阿里那個級別了。脫離用戶規模,應用場景,談高性能,高並發都是沒有意義的。或許你以為的高,換到另外一個層就不高了,甚至換一個場景就不行了。比如,雙十一火車搶票,逢年過節,活動... 具體場景具體對策,有的甚至都不是軟體方面的對策。所以,不要想什麼高性能,高並發的學習方法,滿足當前需求即可,高了都是浪費。等你真正遇到那個瓶頸的時候,會有人逼著你搞高的。總之,高性能高並發不是手段,而是目的,為了達到這個目的會有各種各樣的手段。
突然想到以前一個類似的回答
:語言本身的簡單,開發的快捷並不是成長的捷徑。相反的你認為是捷徑的有可能是最難走的路。學java吧,同學。
零基礎就先搭個可用的,發現有啥問題再補啥問題。
不存在的,side project天生和這些不相干
工程實踐的東西,是特么教程能教會的?推薦閱讀:
※如何利用mongodb+node.js完成一個搜索的功能?
※Node.js 中 setTimeout(f1, 0) 與 setImmediate(f2) ,f1 f2的執行順序是隨機的嗎,為什麼呢?
※如何進行nodejs非同步編程?
TAG:Nodejs |