後端的輪子(一)

吳YH堅發表於2016-07-06

最近讀了一下kafka的原始碼,真的是很蛋疼,本來準備寫一篇長的關於訊息佇列的文章,結果看到某團的技術團隊有一篇文章了,而且訊息佇列的東西基本上寫全了,就不湊熱鬧了。

作為一個之前做底層的伺服器後端人員,對造輪子這事還是比較有吸引力的,雖然說現在幾乎所有的東西都有成熟的開源實現,但是造輪子總有一種魅力,勾引著我們去創造自己的輪子,這個系列就叫輪子系列吧。

前言

首先,看看這個,想必大家對下面這種簡歷看得比較多了吧?

精通JAVA,Python,熟練掌握C++ 精通Redis,Memcached,Mysql 精通Nginx配置,模組開發 精通Kafka,ActiveMQ 等訊息佇列 精通多執行緒,多程式,IO複用程式設計

這裡面每個都是輪子,如果都是精通,那能精通這些輪子得多強大,至少我hold不住這麼多東西。但是,這並不妨礙愛學習的我們來了解和製造這些輪子。

我們這裡造輪子並不是真的是為了造輪子,現在的輪子非常多也非常好用,不到萬不得已,完全沒有必要去造自己的輪子,我們造輪子,只是為了瞭解輪子的構造,知道為什麼這東西會成為輪子,還有就是這個輪子是怎麼造出來的,在造輪子的過程中,用到的知識基本上會涵蓋整個後端需要涉及到的知識,所以自己造輪子或者瞭解輪子還是很有必要的。

後端的輪子們

說起後端的輪子們,大家都可以說出一大串來,我們大致來數一數啊。

  • 抗在最前面的:LVS,F5,HAProxy這類負載均衡
  • 接下來有Nginx,Apache,Lighttpd這類Http服務
  • 後面還有Redis,Memcached這一類KV儲存器和快取系統
  • 如果是多機部署,肯定還有Kafka,ActiveMQ這種負責解耦的訊息佇列
  • 當然也少不了Thrift這種RPC框架和Protobuf這種序列化技術
  • 如果夠高階,到了分散式領域了,zookeeper也是輪子了

恩,感覺上差不多也就這些了吧?和上面的簡歷出現的東西差不多能對上了吧?後端的輪子們,排得上號的也就是這些個方面了吧,可以做一個技能樹出來,精通了上面這些輪子和輪子的使用,基本上後端的工作就遊刃有餘了,剩下的就是一些業務邏輯了,哦,當然,放心,你精通不了全部的,但瞭解甚至熟悉還是能做到的,好了,接下來的一段時間,讓我們一起來點亮這棵技能樹吧。

這裡沒有寫資料庫這個東西,一是我認為他不是輪子了,他比輪子複雜多了,屬於像作業系統一樣的基礎結構了,二是這系列文章都是會對應程式碼的,資料庫我寫不出來,這才是關鍵原因。

接下來的文章更新不會很頻繁了,我會按照上面這個技能樹,一個技能一個技能的點亮這個技能樹,有些我瞭解得多的就說詳細點,有些瞭解不深的就少說點,反正都會點出來,每個技能樹都會配上最最最基礎的程式碼實現這個輪子,當然這些程式碼是不能用在生產環境拉。 最後,我會使用實現的輪子們,打造一個簡單的推薦引擎,也算物有所用了。

恩。。。程式碼還沒有寫一行,所以這個系列文章更新會比較慢。望耐心:) 另外,不要對程式碼抱有很大的希望,都只會是最最基礎的測試程式碼,不能用在生產環境,比如http伺服器的話,不會實現整個http服務,可能只會實現後面會用到的GET方法,請把關注點聚焦到每篇文章上

輪子的輪轂

既然要造輪子,那首先還是要有點基礎技術才行,也就是先要知道哪些東西是輪子的輪轂,哪些東西是輪子的胎了,程式碼說到底就是資料結構和演算法了,所以無論什麼輪子也逃不開這兩個東西,除了這個還需要一些作業系統和網路相關的知識,要實現上面的那些個輪子,需要用到哪些知識呢?我們撿最基礎的和最常用的說說,後面的文章會一一說到這些東西。

  • 雜湊表,這個是很多輪子都要用到的東西,之前有一篇介紹雜湊表的文章,後面還會繼續這個演算法和對應的資料結構。
  • 樹,棧,佇列這些個最基礎的資料結構也是會經常用到的,其中包括了各種各樣的樹的實現。
  • 資料編碼的基本知識。
  • 計算機網路知識,包括一些網路協議,不僅僅是http協議,還有底層一點的tcp協議,因為有些輪子需要在tcp上實現自己的協議。
  • 作業系統和計算機體系結構的一些知識也是必不可少的。
  • 分散式的一些知識也是需要知道的,最後一個輪子是zookeeper,實際上是paxos協議了,我覺得我實現不了一個最簡的paxos(因為這玩意就沒有最簡可言,必須要全實現出來),但是這部分知識還是會說到的。

好了,大約上面這一些知識就差不太多了,畢竟只是一個最簡的實現,別看每個也就一句話,要真正瞭解這些也不是一件簡單的事情,更別說精通了,所以看到那種全屏精通的簡歷,肯定是扯淡的,找準一個你瞭解的領域,一頓虐吧。

輪子的胎

除了輪子的輪轂,那是支撐整個輪子的,還有一些外圍的基礎技術,構成了輪子的輪胎,這部分東西就是一些程式設計上的技術了,都包括:

  • 多協程,多執行緒,多程式程式設計。
  • 網路程式設計,多路複用技術,還有相應的事件輪詢模型。
  • 共享記憶體,記憶體對映,管道技術。

這裡也就簡單的三行,要都瞭解並且精通也很不容易,所以這些東西我也不可能講得很好,肯定有不正確的地方,歡迎大家指正出來,共同進步哈:)

造輪子的材料

造輪子的材料選golang,有時候可能會直接使用C,因為啊,Java不怎麼會,其他語言來造輪子也不太常見。

結尾

本篇就是開了個頭,後面我們一個一個來說。

如果你覺得不錯,歡迎轉發給更多人看到,也歡迎關注我的公眾號,主要聊聊搜尋,推薦,廣告技術,還有瞎扯。。文章會在這裡首先發出來:)掃描或者搜尋微訊號XJJ267或者搜尋中文西加加語言就行

相關文章