2016年5月29日 星期日

DevOps Lessons Learned at Microsoft Engineering 筆記

筆記

組織

  • 講Microsoft裡面的DevOps
  • 故事描述的是Cloud & Enterprise and the Bing teams
  • 以前,在一個Feature Team有三種角色:program managers, developers, and testers
  • Developer與Tester在組織架構上就分開,還有一個operations team
  • 我們想要減少內部溝通所需花的心力所以:
    • 結合Developer與tester->software engineer:讓一個feature能從無到有產出並能正確穩定運行
    • 把operations team的人也帶進來->service engineer
  • 要做到最好的單一服務,就是需要一個可以緊密合作的團隊,寫code與測試與運營的人應該要能緊密合作。
  • 最後組織的安排,把dev team與test team結合,operations team也拉進同一個大組織裡。
  • 在這個大架構,接下來就分成Feture team,負責單一個解決方案,Feature,或Product
  • 有專門開發運營內部工具的team
  • 有開發功能的Feature team,由10~12人組成,採用自我組織,自我管理的方式
  • 有4307人在Develper Division,436人在Team Service Team(指的是Visual Studio Team Service),在Team Service Team有35個Feature Team
  • 一個Feature Team有
    • 一個program manager
    • 一個engneering lead
    • 幾個software engineer
    • 幾個service engineer,他們同時支援多個team,但是都在同一個Product裡
  • 另外一個改變就是,相較於之前不同組織就在不同的區域,現在同一的Feture team的人都搬到一起,所以大家不管是討論、接電話,所有有關工作的事情都可以有共同的體驗

責任

  • 上述的所有改變的主要目標就是責任的改變
  • software engineer與service engineer要一起搞出最好的結果
  • 要有量測數據來證明團隊做得好或不好,像是test coverage或是SLA
  • software engineer的責任不再只是把東西做出來,並且還要保持產品的健康
  • 要Feature team的成員對客戶的問題有所洞察,如何讓客戶能很喜歡產品
  • Feature team有完全的責任在產品如何設計開發測試佈署
  • service enginner要更多瞭解他們運營的產品,並提供基礎架構與產品的意見,與部署運營的script or code
  • Automation是Microsoft裡面軟體生命週期與快速產出價值給使用者的關鍵
  • 以前像是,手動測試,環境架設,發行管理,都被自動化了
  • 這樣的運作方式更靈活,也有更多機會可以失敗
  • 因為都做到自動化,Dev可以自己管理Change,並且導入Feature flags,用來減低風險。
  • 導入這些改變之後作者覺得有在Startup的驅動力與興奮感(?)

飛行中(!)佈署

  • 從Visual Studio Team Services到OneDrive iOS App,都用Canary Release (派一隻金絲雀到礦坑裡試試有沒有毒氣),這在VSTS team叫deployment rings。
  • 團隊弄好版本後,經過自動build與test,然後發布到內部測試帳號,或早期體驗帳號,或是developer自己的機器裡。
  • 現在在VSTS team的deployment ring有4個,有12個單位遍布Azure regions
  • 第一個ring是有VSTS帳號的
  • Feature team的lead engineer核准發布的第一個ring,因為在第一個ring的都是Feature team的人,自己先測完之後再自動化發布到其他的ring,如果有問題就自己趕快修。
  • 而大部分的功能都有feature flag來控制
  • 接下來是OneDrive App的例子
  • OneDrive App團隊用VSTS來自動build與test,然後用HockeyApp來發布到ring上
  • HockeyApp可以提供安裝,運行,Crash與使用者統計,目前是用在內部測試的ring
  • 接下來就是用Apple的TestFlight來給beta tester測試
  • 一旦ok了就打開feature flag正式發布給所有使用者

Idea Velocity

  • 有了Continous Delivery,idea可以快速的被評估測試。
  • 在Bing,任何idea都快速的被實驗測試收集統計資料,所以可以比較正確地被評估,這樣更激勵內部人員提出並實行他們的idea

2016年5月28日 星期六

Riot工程師分享:THE ARCHITECTURE OF THE LEAGUE CLIENT UPDATE 筆記


心得

看了這篇才知道可以用CEF來開發Desktop Client,Java Script統一所有前端的浪潮還在持續呀。最後講到了”datacenter in a desktop.”也蠻有趣的,Plugin架構雖然不是什麼新觀念,但卻可以很好的解決他們遇到的問題,以後遇到可以參考一下。話說回來,要寫個windows client要同時寫C++與Java Script,好像有點OOXX,不過這是因為他們不想連遠端Server的實作都改的折衷方案,畢竟Client整修失敗,就把舊的拿出去用就好,Server整修失敗,就….

筆記

  • 主要就是談:the League client update,進遊戲之前的Client Application
  • 原本使用Adobe AIR,使用它的RTMP協定,動畫呈現,而且還是跨「桌機」平台。遊戲推出的當下,可說是很好的解決方案,不過接下來就開始不合時代潮流,因此要做新架構
  • 新架構要解決的:
    1. 用HTML5+JavaScript的解決方案,不管是在client端呈現,或是與Server溝通,還有工作流程與開發環境都比原本更有擴充性且易用。
    2. 不管是遊戲內遊戲外,玩家都可以保持連線:原本Adobe AIR的方案對PC資源使用率過大,也不支援手機。
    3. 工程師們想要有個更簡單一致的開發架構。
  • 一開始想要改少一點,想說直接重用Adobe AIR的code來搞,但發覺現在已經有更多更好的方案。
  • 後來選擇了 Chromium Embedded Framework (CEF) ,寫Desktop Client就像是寫網頁。對HTML 5有很好的支援,而且界面修改自訂可以更靈活。
  • 決定重寫(!),重寫很危險,但好處比壞處多就上。

Step A

  • 所以Client界面主要就是Java Script
  • 為了要讓Java Script與原本的Server溝通,原本Server是支援RTMP,所以他們為Java Script Client開發了一個C++原生Library,負責用RTMP與Server溝通,以及提供非同步的處理。
  • 為什麼Server還是用RTMP?因為不想同時Client與Server。
  • 選擇ember.js當Java Script Client框架,ember-orbit當作資料層
  • 看起來架構還不賴?問題馬上出現了。
  • Java Script Client變得非常複雜,裡面的元件各自處理非同步的部份,使用者的狀態也保留在Java Script Client這一層(!),所以記憶體變得很大。
  • 這個方案解決1.但是2.與3.都沒有處理好,而且Developer抱怨連連。

Step B

  • 開始思考一般Web Application是怎麼做的,反正都用Java Script了,來向一般Web Application取經
  • 發現少了中間層!
  • 所以弄了個C++寫的micro service層,但是在本地端!
  • micro service層就像是http server,按照REST的規則來提供資源存取,讓Java Script Client不要處理非同步(複雜度的主因)。
  • micro service層與Java Script Client層用Web Socket溝通,micro service層與遠端Server還是用原來的RTMP溝通
  • micro service層取名叫Foundation
  • 弄成這個架構之後,精簡掉所有不必要的Java Script VMs,只留下Foundation,Java Script Client都只用GET
  • Foundation大概佔用20MB記憶體,玩家不需要把Java Script Client砍掉才進LOL裡面!
  • Foundation可以用system tray來呈現,不管玩家有沒有打開LOL都可以接觸到遊戲資訊。

Step C

  • 換成新架構後,寫功能就是要寫micro service與遠端server,micro service與Java Script Client。
  • 大家都改同樣的地方,互相影響。
  • 需要架構上的解決方案來讓團隊協作更有效率。
  • 作者自己研究了許久,決定採用Plug-in架構
  • 每個Plug-in必須有自己的Semantic Versioning,還有它依賴哪個Plug-in與這個Plug-in的Semantic Versioning。
  • 把架構呈現成Graph的形式,Plug-in的相依性一目了然
  • 所以有front-end (FE) plugin,用Java Script,實作UI。有back-end (BE) plugin,用C++,實作資料處理與遠端Server溝通。
  • 取名叫Front-end與Backend是代表這個架構模仿所謂的Client-Server架構
  • 用Plug-in可以簡單開關使用者可用的功能,通常是不同區域的使用者。
  • 由於之前用ember-orbit,Front-end還是可以直接操作很多資料,又增加複雜到,所以讓ember-orbit退休,資料都透過REST從back-end plugin拿,front-end plugin可以快取資料,但其他複雜資料的處理就不要在Front-end了。

Step D

  • 已經有了更有生產力的架構,大家可以各自做自己的Plugin不會互相影響。
  • 有些人不喜歡Ember.js,想直接用HTML 5的東西。
  • 有些人在別的地方已經有了現成的Web Client,想說直接搬到這個Java Script Client,這樣就不用重作一次Client,反正都是Java Script。
  • 本來很堅持來這邊開發就一定要用Ember.js,後來發現,就算每個Plug-in都用Ember.js,要保持每個Plug-in的Ember.js的版本相同,也很困難,公司太多Developer了。
  • 最後改成每個Plugin都可以用自己的Java Script Framwork

結論

  • 最後的架構,可以讓多個團隊獨立的開發the League client update,HTML5 Front-end與C++ back-end的配合夠靈活效能也夠好。Plug-in架構不只對開發有幫助,對實際產品呈現也有幫助。
  • 大部分人都很滿意!
  • 回頭來看,這就是一種”datacenter in a desktop.”的架構,Atom就是如此。
  • 還有HTML視覺效果,功能可以獨立更新發布還沒講。

DevOps Lessons Learned at Microsoft Engineering 筆記

原文: https://www.infoq.com/articles/devops-lessons-microsoft 筆記 組織 講Microsoft裡面的DevOps 故事描述的是Cloud & Enterprise and the Bing ...