日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
FeatureFlag功能發(fā)布控制

背景

為懷化等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及懷化網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為成都網(wǎng)站制作、成都網(wǎng)站設計、懷化網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

產(chǎn)品在新功能發(fā)布前,可能會采取小流量測試的方式,或者在確定方案前使用A/B測試來衡量。一般開發(fā)人員會跟運維同學合作,通過一些現(xiàn)有平臺切換機器或者流量來實現(xiàn)。本文介紹了另外一種簡便的方式,并解釋了其在持續(xù)集成上的應用,同時提供了現(xiàn)有的開發(fā)框架供快速使用。

Feature Flag VS Feature Branches

Feature Flag(又名 Feature Toggle、Flip等)是一種允許控制線上功能開啟或者關閉的方式,通常會采取配置文件的方式來控制。提到Feature Flag一般都會跟Feature Branches進行比較。這兩個有什么關聯(lián)與差別呢?可以通過一個簡單的示例來比較:

假設產(chǎn)品需要添加一個功能,如果你在主干上進行開發(fā),那么通常的做法是在前端開發(fā)人員在界面上添加功能,然后可能會有其他同學來完成后端服務、安全保障,最后測試及Bug修復并發(fā)布上線。如下圖所示:

上圖中有個明顯的問題是主干分支上在功能測試完畢之前是不能進行發(fā)布的,因為功能已經(jīng)在提供在界面中,必須完備之后才能發(fā)布給用戶使用。

當然解決方法也很簡單,例如我們常見的是會使用功能分支(Feature Branches)來解決。在主干上拉取一個分支,然后在分支上開完測試完之后在合并到主干上,這樣就不會影響主干的持續(xù)發(fā)布了。如果有另外的新的功能那么同樣拉取新的分支來解決。如下圖:

但這樣同樣存在問題,如果一個功能比較復雜,開發(fā)的周期較長,而在此期間主干上已經(jīng)多次修改代碼,那么等分支上開發(fā)完之后合并到主干將是一個比較麻煩的工作。你必須去處理各種沖突,與其他開發(fā)人員溝通修改點。這是很多人不愿意做的。

于是有人提供了新的方案來解決這個問題。例如將開發(fā)工作拆分成多個小塊,在各個分支上開發(fā)測試完成后及時合并到主干中,并且可以先隱藏界面功能,直到所有的功能開發(fā)完成之后才展現(xiàn)。這樣每次合并的難度就小多了;或者每次將主干上的修改都及時同步到分支上,這樣分支上開發(fā)完成之后合并到主干上就簡單多了。

但如果發(fā)布時出現(xiàn)bug怎么辦?可能常見的是進行回滾重新上線。有什么方式既能避免分支合并的麻煩、保持主干快速迭代隨時發(fā)布,又能更好的控制新功能的發(fā)布、方便的進行小流量或快速回滾操作呢?答案就是Feature Flag。

Feature Flag允許關閉未完成的功能,你可以在主干上進行迭代開發(fā),新功能即便未開發(fā)完成也不會影響發(fā)布,因為它對用戶是關閉的。當功能開發(fā)完成之后,修改配置便可以讓功能發(fā)布。這種操作甚至可以在線上進行,例如代碼已經(jīng)發(fā)布但功能不可見,你可以修改配置讓功能對特定的用戶(線上測試、小流量或者全量發(fā)布等)可見。如果發(fā)現(xiàn)新功能存在問題,那么可以通過配置文件來迅速回滾,而必須重新分支上線。Feature Flag原理示意圖如下:

各自的優(yōu)缺點

選擇合適的方案,而不拘泥于方式本身

并沒有萬能的方案,兩種方式都有各自的優(yōu)缺點。

Feature Branches

優(yōu)點:

同時開發(fā)多個功能分支不會影響主干和線上代碼

在分支上開發(fā)新功能時不用擔心對其他在開發(fā)的功能的影響

現(xiàn)有很多持續(xù)集成系統(tǒng)支持分支的構建、測試、部署等

缺點

Martin Fowler的文章中已經(jīng)做了全面的闡述:

分支分出去時間越長往往代碼合并難度越大

在一個分支中修改了函數(shù)名字可能會引入大量編譯錯誤。這點被稱為語義沖突(semantic conflict)

為了減少語義沖突,會盡量少做重構。而重構是持續(xù)改進代碼質量的手段。如果在開發(fā)的過程中持續(xù)不斷的存在功能分支,就會阻礙代碼質量的改進。

一旦代碼庫中存在了分支,也就不再是真正的持續(xù)集成了。當然你可以給每個分支建立一個對應的CI,但它只能測試當前分支的正確性。如果在一個分支中修改了函數(shù)功能,但是在另一個分支還是按照原來的假設在使用,在合并的時候會引入bug,需要大量的時間來修復這些bug。

Feature Toggle

優(yōu)點:

避免了分支合并代碼沖突的問題,因為是基于主干的開發(fā)

每次提交都在主干,迭代速度明顯有優(yōu)勢

新功能的整個過程都持續(xù)集成

缺點:

未完成的功能可能會部署到線上,如果配置有誤可能將未完成的功能開啟。當然可以將界面層最后開發(fā)避免過早暴露。

主干上擔心提交代碼影響其他功能。

我們可以根據(jù)需要選擇合適的方案。Feature Flag在避免分支合并加快迭代上有優(yōu)勢,另外Feature Flag除了主干開發(fā)上的支持,還有什么實用功能呢?下面來介紹。

Feature Flag種類與應用

一般Feature Flag可以分為兩類,見下所示:

發(fā)布開關:

在發(fā)布代碼時關掉未完成的功能

生存期短

功能穩(wěn)定就馬上刪除

在整個開發(fā)過程中有預定義的值

業(yè)務開關:

實現(xiàn)A/B測試

針對特定人群發(fā)布功能盡早獲得反饋

針對特定條件開啟或者關閉功能。例如可以設置在指定時間點開啟,這樣新功能將按照設定自動上線下線,無需手動上線,適合專題等情況

能線上開啟或者關閉,實現(xiàn)快速回滾

發(fā)布開關主要是為了隱藏未開發(fā)完成的功能,而業(yè)務開關則可以幫助我們快速滿足某些需求。例如A/B測試,F(xiàn)eature Flag可以輕松控制展現(xiàn)哪個功能,提升A/B測試的可維護性。我們也可以通過配置里面的邏輯讓新功能針對小部分人群甚至是特定地域的人群發(fā)布,盡早獲取功能的反饋。甚至是可以在線上開啟調(diào)試,只讓新功能對調(diào)試人員可見。而這些都只需要配置文件和簡單的標記來實現(xiàn)。

誰在用Feature Flag

功能看起來很酷,但是不是新東西?有誰在用呢,我可不不愿意承擔風險

事實上Feature Flag已經(jīng)在國外互聯(lián)網(wǎng)公司中獲得廣泛的使用。例如FaceBook、Google等公司使用基于主干的開發(fā)模式來持續(xù)集成開發(fā),F(xiàn)eature Flag是其中一個基礎技術。下面這幅圖展現(xiàn)了FaceBook開發(fā)模式轉變歷程,可以看到幾年前facebook就開始使用Feature Toggle,使用了Feature Flag關閉主干上未開發(fā)完成的功能來保證快速迭代和高頻率的發(fā)布。

國外主干開發(fā)中推薦這樣一種方式:trunk作為開發(fā)主線,所有開發(fā)人員完成開發(fā)后向及時向主干提交代碼,開發(fā)人員不允許在主干上拉取分支。在發(fā)布的時候由系統(tǒng)拉取分支發(fā)布,主干上的bug修復及時同步到發(fā)布分支。開發(fā)人員可以本地使用git等工具進行版本管理。如下圖所示:

雖然基于主干的開發(fā)模式已經(jīng)成為國外的主流,但分支開發(fā)并不是不該使用。使用分支不推薦的是讓新功能代碼在分支上長時間堆積,分支應當是生存周期短的。

實際應用中我們可以根據(jù)業(yè)務場景來選擇是否用功能分支還是Feature Flag,并且這兩者可以相互結合。例如在文章前面提到的示例中,可以使用分支來開發(fā)細分的子功能保持分支及時合并,同時使用Feature Flag來控制功能的發(fā)布,提升工作效率。

最佳實踐

除了主干開發(fā),什么情況下選擇使用Feature Flag呢?下面是使用Feature Flag的一些典型場景:

在 UI 中隱藏或禁用新功能

在應用程序中隱藏或禁用新組件

對接口進行版本控制

擴展接口

支持組件的多個版本

將新功能添加到現(xiàn)有應用程序

增強現(xiàn)有應用程序中的現(xiàn)有功能

可以看到,由于Feature Flag本身是對業(yè)務功能的控制,所以不適于功能大范圍的改動等情況。另外使用過程中需要注意一些問題:

只在需要的地方創(chuàng)建開關。美酒雖豪,不可貪杯。濫用任何技術都會出現(xiàn)問題。

控制開關的數(shù)量。同上,開關應按需使用并及時清除。

開關之間代碼保持獨立。如果代碼存在依賴就沒法刪除,最終維護性反而變差

清除發(fā)布開關和廢棄代碼。發(fā)布開關應當在功能穩(wěn)定后刪除,舊代碼也是。

界面層最后暴露。

如何實現(xiàn)

實現(xiàn)這套東西復雜嗎?下面以php和smarty模板為例來介紹。

首先需要一套控制代碼邏輯的工具,雖然開源的框架有在后端代碼層的支持,但推薦在模板層使用Feature Flag,因為模板直接跟功能掛鉤,維護起來更加直觀方便。

例如我們會提供一個smarty插件,讓你控制相應的展現(xiàn):

這個代碼的意思是如果common模塊的featureA命中,則展現(xiàn)下面代碼,否則展現(xiàn)另外一套代碼,展現(xiàn)代碼由于與功能相關,所以就相當于控制了展現(xiàn)哪個功能。當然你也可以不用featureelse只控制功能的開啟或者關閉。

另外我們需要一個配置文件,對應featureA的配置,如下所示:

 
 
 
 
  1. {
  2.       "features" : {
  3.           "featureA" : {
  4.               "type" : "switch",
  5.               "value" : "on",
  6.               "desc" : "test switch feature work or not"
  7.           }
  8.       }
  9.  }

featureA配置的value是on,開關類型是switch。也就是說這個功能是開啟的。與switch類似的可以實現(xiàn)多個feature類型,例如抽樣控制、日期控制、地域控制等,代碼邏輯只需要根據(jù)value的設定判斷是true還是false。例如抽樣類型,value設置0.5,那么對應的類型邏輯只需要判斷隨機數(shù)是否在0-0.5范圍內(nèi)而已。

部署中我們只需要修改featureA的配置就可以控制功能的發(fā)布,是不是so easy!

開發(fā)框架

有哪些相應的開源框架呢?幾乎各種語言都有相應的實現(xiàn)。例如FEX FIS小組提供了基于php和node.js的框架。此外還有多種語言的開源實現(xiàn):

語言 Feature Flag框架

php 基于smarty的Feature Flag框架

NodeJs 基于Node前后端解決方案Yogurt的Feature Flag框架

java Togglz

.NET FeatureToggle

Ruby Rollout、Degrade

Python Gargoyle、Nexus admin

Groovy GrailsFeatureToggle

總結

Feature Flag與Feature Branches各有優(yōu)勢,結合使用能發(fā)揮更大作用

結合業(yè)務場景選擇合適方案

Feature Flag能支持主干開發(fā),并在控制功能發(fā)布上有獨特優(yōu)勢

本文鏈接:http://blog.jobbole.com/73930/

【責任編輯: chenqingxiang TEL:(010)68476606】


網(wǎng)頁標題:FeatureFlag功能發(fā)布控制
文章網(wǎng)址:http://www.5511xx.com/article/dhcgsjp.html