支撐Github的開源技術

jopen 10年前發布 | 25K 次閱讀 Github

  Github 在 3 月 19 號開放了新的項目展示頁面(Showcase),Showcase 根據項目屬性來組織、定義一系列的開源項目列表,可以更清晰的發現你所需要的開源項目。在 3 月 26 日的 Showcase 中,Github 放出了一個新的類目:支撐 Github 的開源技術,這里列舉了 Github 所使用的一些主要的開源項目。
  如下是這些開源項目的介紹:

  linguist

  語言識別庫,能夠自動根據項目的代碼來識別你所使用的語言。 在你的項目源代碼頁面,可以看到一個彩條,點開以后會顯示項目中的編程語言比例。linguist 主要通過文件的后綴來識別,對于一些通用的擴展名,例如.m 文件,linguist 通過一些語言的特征片段來做判斷。由于編程語言很多,linguist 還不能覆蓋所有語言的檢測。

  jquery-pjax

  pjax 是 Github 的聯合創始人之一 defunkt 的作品,它使用 html 的 pushState 特性與 ajax,可以實現頁面內容動態局部刷新,當點擊項目源代碼頁面中具體的一個文件或者文件夾時,你將會看到頁面的其他部分是不變的,只有定義的頁面 DOM 會刷新,這里使用的就是 pjax。

  elasticsearch

  Eleasticsearch 支撐了 Github 的搜索功能,2 年之前 Github 使用 Solor 做搜索,隨著用戶和托管項目的增加,索引的大小超過了 solor 節點的最大存儲空間,也出現了很多的問題,Github 團隊在思考解決方案時決定使用 Elasticsearch 做替換。Github 最開始使用 ES 時,使用了 44 臺亞馬遜 EC2 實例,每臺實例配備 2T 的存儲,其中 8 臺實例指負責查詢請求。目前,Github 已經將原有的 EC 搜索集群遷移到了東海岸的一個數據中心,使用 8 臺物理主機替換了 44 臺 EC2。

  Rails

  Ruby 實現的 MVC Web 框架。Github 的用戶界面和功能大部分基于 Rails 構建,不過需要注意的是現在雖然 Rails 的項目版本已經發展到了 Rails 4,但是 Github 依舊使用的是自己維護的 2.3 分支,對于不保持和現有的 Rails 主版本號一致的原因,Github 員工 Kneath 做了如下的解釋:

  1. . 花更過的時間來升級更新 Rails,將會減少為用戶構建新特性的時間,我們更關注用戶;
  2. . 性能問題是一個很重要的考慮。在過去的幾年中,我們極大的減少了響應時間。而升級 Rails 不僅會帶來一個更慢的框架,而且還會引入一個不同的架構——我們需要再根據新的框架特性來定位優化性能。我們對于現有的框架已經做了很多的優化以保持性能 穩定,最主要的是:將時間花費在升級上不會讓我們的架構更快。
  3. . 過去的三年我們一直在升級這個堆棧,不升級 Rails 版本我們依然可以使用新的特性。
  4. </ol>

      Redis

      Redis 是K/V存儲系統,知名的 NoSQL 實現之一,在 Github,主要使用 Redis 來進行隊列中的異常處理。在 Github 早期,曾嘗試過很多的基于 Ruby 的隊列機制,也曾使用 Amazon SQS,但是這些方案都不能在 Github 快速增長的同時滿足穩定性要求,最終 Github 遷移到了使用 Redis 的技術方案 resque。

      sprocket

      Sprocket 是一個網站資源打包的 Ruby 庫,它不僅能夠管理 JavaScript 和 CSS 資源,還可以按照 pipline 的方式來流式預處理 CoffeeScript、Sass、SCSS 和 LESS 代碼等;

      libgit2

      libgit2 是一個便攜式、純C語言實現的 Git 核心方法類庫,提供 API 重新鏈入 Git 方法。Github 的背后使用的原生的 git 來實現 commit、push 等功能,但是使用 libgit2 來針對桌面應用調用、Ruby 代碼中調用等;

      rugged

      libgit2 的 Ruby 類庫;

      bcrypt-ruby

      OpenBSD bcypt ()密碼哈希算法的 Ruby 實現;

      html-pipeline

      html-pipline 是一個 gem 包,可以將現有 Github 前端 HTML 中的一些特性進行流式處理,例如在 Github 的評論框中,你可以@某一個人、輸入 emoji 的表情、使用 markdown 的語法來寫內容等,但是這些都是由單獨的插件來控制的,html-pipeline 可以流式的使用相應的插件處理原始內容,例如先將 markdown 轉義成 html,繼而自動添加 emoji 表情,然后進行代碼的語法高亮等。

      gemoji

      在 2013 年的 QCon 北京前夜:Github Drink Up 活動中,來自 Github 的工程師 Tim 在現場的活動中談到了他們的一個文化:使用 emoji。他解釋道:“很多情感使用文字不能做出形象的表達,但是使用 emoji 表情卻能夠起到不一樣的效果”。在 Github 現有評論框或其他內容中,都可以看到 emoji 的身影,所使用的就是 gemoji 這個 gem 包。

      jekyll

      Jekyll 是一個靜態博客生成的程序,Github 中項目的 Page 頁面,默認選型使用的就是 jekyll。

      gollum

      Gollum 是一套基于 git 的 wiki 系統,Github 項目的 wiki 系統背后使用的就是這套開源框架;

      octokit.rb

      Github API 的官方 Ruby SDK;

      Hubot

      Hubot 是 Github 自行開發的一個聊天機器人,當然它已經超過了聊天機器人的范疇,Github 作為一個異步辦公的團隊,日常的協作、溝通很大部分依賴于聊天室,通過 Hubot,Github 的員工可以在聊天室中給機器人定制一些特定的回復、3D 打印模型,甚至通過 hubot 來部署生成環境的代碼、獲取服務狀態等,在 2013 年的 QCon 北京中,Giuthub 的工程曾針對如何使用 Hubot 做運維進行過分享:《ChatOps at GitHub》

      d3

      d3 是使用 JavaScript 實現的數據可視化框架,使用 HTML、SVG 和 CSS 等,在 d3 的基礎之上發展處諸如 crossfilter、NVD3.js 等一系列擴展或者簡化框架,并且形成了一個良好的社區。作者 mbostock 目前供職于 NYTimes,d3 是他的博士論文項目,目前 Github 使用 d3 來展示托管項目提交歷史、記錄等的可視化效果圖。

      plax

      plax 是控制視差元素的 JavaScript 類庫,你可以在 404、505 等頁面看到它的實現效果。

      ace

      Ace 是一個使用 Javascript 開發的代碼編輯器,具備語法高亮、快捷鍵綁定等特性, Github 使用 Ace 實現基于 web 的代碼編輯功能

      zepto

      Zepo 是一個 JavaScript 框架,其特點是兼容現有 jQuery API 的同時,自身體積十分小;

      zeroclipborad

      Github 的“點擊復制到粘貼板”的功能就是使用的 zeroclipboard,zeroclipboard 使用一個不可見的 Adobe Flash 動畫來實現復制粘貼,并提供 Javascript 的 API 接口以供調用。

      charlock_holmes

      charlock_holmes 用來檢測字符編碼格式,并可以自動將字符編碼轉化成 UTF-8。

      puppet

      服務器運維工具,可以進行自動化部署、集群管理等。

      moment

      moment 是一個日期框架,用于解析、驗證、格式化日期等,其中一個常用的功能是將原始的 Javascript 時間類型轉化成方便閱讀的時間說明格式,例如:”2 小時之前“、”3 天之前“這種形式。

      bower

      前端資源包管理工具,可以通過bower install <package>的形式將常用的前端資源下載到本地的項目目錄中,例如:bower install bootstrap 將會自動下載 bootstrap 的項目資源到本地的項目目錄中,不需要自己手動來下載、移動資源文件,并且通過配置文件可以方便分享給同事、簡化項目初始化等;

      resque

      Resque 是 Github Enterprise 中使用的一個基于 Redis 的后臺作業控制系統,提供可視化的界面,可以方便的監控后臺作業的運行狀態和監控情況。

      另外,Github 還發布了“支撐 Github Windows 客戶端的開源項目”和“支撐 Github Mac 客戶端的開源項目”兩個 Showcase。
      感謝楊賽對本文的審校。

    來自: InfoQ
                        <span id="shareA4" class="fl">                          </span>
     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!