"기능 플래그"란 무엇입니까?


115

높은 확장 성은 여기에 기능 플래그를 언급합니다.

확장성에 해로운 5 가지 , "5. 기능 플래그 부족"

기능 플래그는 정확히 무엇입니까?


1
맥심 Vexler가 지적 하듯이,이 플리커 게시물 기능 플래그에 정식 초기 제품 중 하나이며, 일부 세부에서의 사용 및 구현에 대해 설명 code.flickr.com/blog/2009/12/02/flipping-out를
노아 서스

답변:


104

'기능 플래그'(또는 기능 토글 )는 애플리케이션의 기능 (하위 섹션)을 쉽게 켜고 끌 수있는 기능입니다.

  • 재배포를 통해 또는
  • 페이지 / 기능을 라이브로 전환 할 수있는 내부 페이지

예를 들어 부하가 너무 높으면 db 쿼리를 줄여야하는 경우 기능 집합을 다소 줄일 수있는 컨트롤을 사용하는 것이 편리하다고 생각합니다.

거기 다른 이유의 힙 수 있도록 주요 존재의 하나 - 당신은 비록이 사용하고자하는 것이다 연속 배달을 라이브 아직 완료 될 때까지 전환 비활성화 기능을 / 데 / 생산으로 일을 추진는 :. 우리는 종종 '개발 쿠키'를 사용하여 개발팀에게만 미완성 기능을 보여줍니다. 이렇게하면 부분적으로 완료된 작업 (오 예! 더 나은 통합이 있습니까?)을 여러 릴리스 / 배포에 걸쳐 테스트 할 수 있습니다.이를 '토글 해제'(완료)하고 대중에게 공개됩니다.

다음은 ASP.NET MVC 영역에서이 작업을 수행하는 데 도움이되는 간단한 패키지입니다. https://github.com/cottsak/DevCookie (전체 공개 : 저자입니다)

Fowler는 또한 더 많은 세부 사항과 함께 위에 링크 된 것보다 훨씬 긴 기사를 가지고 있습니다.

이 게시물 (Fowler 사이트에서도)은 다양한 유형의 토글 전략을 설명합니다 . DevCookie 는 메인 라인 / 트렁크 기반 전략을 지원 하며 기사에서는 " Release Toggle " 이라고합니다 .

Adil의 답변 은이 인프라 중 일부를 원할 수있는 많은 용어와 이유가 있음을 강조합니다. 이러한 것 중 일부만 필요할 수 있습니다. 예를 들어 간단하고 민첩한 배포 / 배달 워크 플로 만 사용하고 싶을 수 있으므로 간단한 인프라로 충분합니다. 그런 다음 A / B, 코호트 테스트 및 제어 된 롤아웃과 같은 작업을 통해 완전한 #leanstartup 실험으로 이동하려는 경우 이러한 데이터 기반 개발 방법을 별개의 솔루션으로 용이하게 하는 분석 도구 (예 : )를 고려해야합니다. . 위의 모든 작업을 수행하는 토글 인프라는 부풀고 불필요한 복잡성을 유발합니다.

여기까지 해보 셨다면 메인 라인 개발, 기능 전환 및 TEST, QA, SIT, STAND, CROUCH와 같은 다른 어리석은 아이디어에 대한 저의 다른 생각 을 확인하고 싶을 것 입니다.


1
재미있게도 나는 내가 무엇을 만들 든 항상 같은 것을 상상 해왔다. 그것은 매우 효과적인 기능이 될 수 있습니다.
GurdeepS 2011 년

7
종종 당신은 명백해 보이는 이와 같은 것을 발견 할 것입니다. 누군가는 항상 그 이름을 생각해 냈습니다.
Matt Kocaj 2011

27

기능 플래그는 새 코드를 배포하지 않고 구성을 통해 애플리케이션의 일부 기능을 해제하는 기술입니다.

기능 플래그는 기능이 지속적으로 배포되지만 반드시 프로덕션에 "출시"되는 것은 아닌 CI 체계에서 핵심적인 역할을합니다.

여기에 더 많은 정보 :

-- 편집하다:

기능 플래그 자바 구현 .


3
이것은 '지속적 배포'에 잘 설명되어 있으며 '주요'개발의 거의 필수 사항입니다. 기능을 위해 SCM에서 분기하는 대신 기능을 켜거나 끌 수 있으므로 아직 활성화하지 않아야하는 기능이있는 코드를 릴리스 할 수 있습니다.
Chip McCormick

"새 코드를 배포하지 않고 구성을 통해"에 대한 참고 사항 :이 설명은 구성을 변경 한 다음 앱을 다시 배포하는 것을 의미하는 것으로 보입니다 (코드가 변경되지 않았더라도). 배포 파이프 라인에 따라 몇 초에서 몇 분까지 걸릴 수 있습니다. 기능 플래그 또는 기능 토글이 구성에서 유지되지 않을 수 있습니다. 스토어 / db 어딘가에있을 수 있고 "라이브"방식으로 동작 할 수 있습니다. 즉, 사이트 전체에서 즉시 일부 동작을 활성화하기 위해 버튼을 두드리는 일부 관리자 페이지로 이동합니다 (배포 없음, 구성 변경 없음).
Matt Kocaj

1
저는 ConfigCat.com에서 일하며 "새 코드를 배포하지 않고 구성을 변경"한다는 것은 구성이 기능 플래그 서비스에 의해 제공되고 애플리케이션이 해당 구성 파일을 가져 와서 값에 액세스한다는 것을 의미합니다. 이렇게하면 값을 변경할 때 앱을 재배포 할 필요가 없음을 확인할 수 있습니다. 또한 한 사용자에게는 가치를 제공하고 다른 사용자에게는 다른 가치를 제공하도록 규칙을 만들 수 있습니다. 멋진 것은 모든 기능 플래그 평가가 클라이언트 측에 있으며이 모든 논리는 데이터를 기능 플래그 서비스로 다시 푸시 할 필요없이 작동한다는 것입니다.
sige


19

기능 플래그, 기능 토글, 실험 및 제어 된 롤아웃은 단순하지만 강력한 아이디어의 동의어입니다. 기능 롤아웃에서 별도의 코드가 배포됩니다. 간단히 말해서, 고객 중 누가 해당 기능을 볼 수 있는지를 선택하면서 기능의 커밋을 프로덕션에 적용 할 수있는 기능입니다.

그들은 Facebook의 Gatekeeper에 의해 부분적으로 대중화되었습니다 . LinkedIn의 LiX는 또 다른 좋은 예입니다.

이 간단한 아이디어를 수용하면 다음과 같은 많은 모범 사례의 기반이 마련됩니다.

지속적인 배포 / 전달 -하루에 여러 코드를 프로덕션으로 푸시합니다.

트렁크 / 메인 라인 개발 -기능 분기는 오래 지속되는 기능 개발이 아닌 풀 요청에 대해서만 생성되어야합니다.

더 이상 릴리스 기차 는 일을 수렁에 빠뜨리지 않습니다 .

프로덕션의 QA / 성능 테스트 -실제 QA 및 성능 테스트는 프로덕션 트래픽이있는 프로덕션 인프라에 있습니다. 광범위한 성능 랩과 스테이징 환경을 구축하는 데 시간을 낭비하지 마십시오.

실험 -새로운 기능이 KPI에서 바늘을 움직이는 방법을 알아 봅니다.

문제 발생시 핫픽스 또는 코드 롤백 방지 -핫픽스와 코드 롤백은 모두 스트레스가 많고 시간이 오래 걸리며 필요 이상으로 많은 문제를 유발합니다. 대신 기능을 끄거나 낮추십시오.

다른 사람들은 오픈 소스 라이브러리를 언급했습니다. Gatekeeper 및 LiX와 같은 전체 솔루션의 좋은 예는 Split 입니다. 저는 Split에서 일합니다.


CI 대 AB / cohort / lean 실험을 지원하기 위해서만 기능 플래그를 통합하지 않는 것이 중요하다고 생각합니다. 목표가 다릅니다. 예를 들어 기능 토글을 사용하여 QA / 수락을 위해 Prod에 무언가를 가져 오는 것은 CI / CD를 지원하는 간단한 도구가 될 수 있으며이 경우 스플릿이 과도 할 수 있습니다. 그런 다음 린 실험이나 A / B 테스트를 수행 하려면 추가 도구 및 원격 측정보고 기능이 내장 된 Heap 과 같은 훌륭한 분석 도구가 필요할 수 있습니다 .이 두 가지 목표를 병합하는 아이디어가 마음에 들지 않습니다. 매우 쉽게 부풀 수 있습니다.
Matt Kocaj 2017

14

여기에는 Martin Fowler 게시물 에서 대중화 된 중요하고 기본적인 정의를 따르는 훌륭한 답변이 많이 있습니다 .

이는 "팀이 코드를 변경하지 않고 시스템 동작을 수정할 수 있도록 허용"하는 코드입니다.

그래서 우리는 역사적으로 그것들을 의사 코드로 표현 된 것으로 생각했습니다.

if(app_settings["beta-mode"] == "true")
  showAwesomeNewGui();
else
  sameOldSnoozeFeset();

그것은 그것을 생각하는 완전히 정확한 방법이며 Matt와 Adil은 기능 플래그에 대한 다양한 전술적 사용 사례를 통해 멋지게 확장합니다.

그러나 나는 dotnetdev가 원래의 질문을 던진 이후 6 년 동안 현실이 어떻게 진화하고 변화했는지를 반영하는 수정 된 정의를 제공하고 싶습니다. 저는 기능 플래그 플랫폼 인 Rollout.io 에서 일하고 있습니다. 그래서 저는이 진화를 위해 맨 앞자리에 앉았습니다.

간단히 말해서, 기능 플래그는 더 이상 애플리케이션에서 기능을 켜고 끄는 단순한 방법이 아닙니다. 이는 "설명 및 통화 금액"이라고 말하여 "인보이스 항목이란 무엇입니까"라고 대답하는 것과 같습니다. 사실이지만 송장 자체의 더 넓은 지점에서 작동하지 않습니다.

기능 플래그는 현대 소프트웨어에서 가장 중요한 전략적 솔루션의 전술적 부분입니다. 더 많은 정보가있을 때 런타임까지 코드에서 중요한 결정 논리를 연기하는 수단입니다. 그리고 아마도 가장 중요한 것은 버전 번호가 2.7보다 큰지 여부를 확인하는 한 번의 확인으로 더 이상 격리 된 상태로 발생하지 않는다는 것입니다. 이를 사용하는 조직은 일반적으로 포괄적 인 시스템 전체 제품 접근 방식의 일부로이를 포함합니다.

다른 사람들이 언급했듯이 Facebook과 LinkedIn이이를 개척했지만 2018 년에는 많은 조직에서이를 수행하고 있습니다. 개발 전략, 운영 전략 (또는 원하는 경우 DevOps 전략) 및 제품 전략의 일부로 런타임에 대한 의사 결정 논리 질문을 연기하고 있습니다. 다음은 그러한 질문의 예입니다.

  • 우리가 배포하는 새 관리자 화면은 누가 언제 볼 수 있습니까?
  • 이 이스터 에그를 잠금 해제하려면 어떤 수준의 멤버십이 필요합니까?
  • 언제 새 데이터베이스로 전환해야합니까?
  • 전환율을 높이기 위해 체크 아웃 버튼에 치타 또는 독수리 사진을 넣어야합니까?

런타임까지 그러한 결정을 상당수 연기하는 애플리케이션을 갖기 위해 임시 방식으로 애플리케이션에 기능 플래그를 던질 수 없습니다. 그렇지 않으면 기술 부채에 묻히게됩니다. 요즘에는 몇 가지 다른 구성 요소를 포함하는 포괄적 인 기능 플래그 관리 전략이 필요합니다.

  • 토글 포인트 는 새 기능의 동작을 전환하는 데 사용됩니다.
  • 여러 토글 포인트가 함께 모여 토글 라우터 를 형성 합니다 . 토글 라우터는 기능의 상태를 결정합니다.
  • 토글 컨텍스트 는 토글 라우터에 필요한 컨텍스트 정보 (예 : 특정 사용자)를 제공합니다.
  • 토글 구성 은 환경에 대한 토글 라우터 정보를 제공합니다.

그래서 결국 기능 플래그는 무엇입니까?

글쎄요, 그들은 기술 및 시장 요구에 모두 적응할 수있는 응용 프로그램을 갖는 광범위한 전략의 중요한 부분입니다.


9

기능 플래그 ( 기능 전환 또는 기능 토글 이라고도 함 )는 필요에 따라 잠재적으로 비용이 많이 드는 기능을 활성화하거나 비활성화하는 스위치입니다 (예 : 사이트가 예기치 않은 트래픽으로 망가질 때). 이렇게하면 규모를 확장하거나 부하 급증이 사라질 때까지 약간의 시간을 벌 수 있습니다.

다음 은 SWIG 문서의 예입니다 .


6
이것은 기능 플래그의 한 가지 사용입니다.하지만 이해해야 할 큰 개념은 기능 릴리스와 코드 배포를 분리하여 코드가 제공 될 때마다가 아니라 원할 때마다 기능을 릴리스 할 수 있다는 것입니다. 이는 지속적인 통합의 초석입니다.
Eric Elliott

6

우리 회사에서는이를위한 자체 솔루션이있었습니다. .json모든 앱에 대해 다운로드 가능한 구성 ( ) 파일을 제공하는 서비스를 만들었습니다 . 해당 구성에서 기능에 대한 플래그를 저장했습니다. 해당 구성을 기반으로 앱은 현재 기능을 표시하거나 숨길 수 있습니다. (예를 들어 사이드 바에서 메뉴 항목을 표시하거나 숨 깁니다.)

또한 기능 플래그를 구성 할 수있는 내부 관리 페이지도 만들었습니다. 한동안 꽤 잘 작동했지만 그 후에는 사용자 타겟팅과 A / B 테스트를하고 싶었습니다. 스스로 개발하려면 너무 많은 노력이 드는 것 같아서 타사 솔루션을 선택했습니다. 여기에 이미 언급했듯이 이에 대한 많은 솔루션이 있습니다.

사용자 지정 대상 그룹과 백분율 기반 롤아웃을 한 번에 지원하기 때문에 ConfigCat을 선택했습니다 . github 에서 지원되는 오픈 소스 SDK를 확인할 수 있습니다 .


4

기능 플래그 (또는 기능 토글)를 사용하면 애플리케이션을 다시 빌드 / 재배포 할 필요없이 애플리케이션에서 원격으로 기능을 활성화 할 수 있습니다. 이를 통해 코드를 프로덕션에 배포 할 수 있지만 준비가 될 때까지 기능을 릴리스하지 않습니다. 특정 사용자를 타겟팅 할 수 있으므로 베타 사용자에게 새로운 기능을 사용하여 테스트 할 수 있습니다.

우리 회사에서는 이전에 LaunchDarklyFeatureFlags.io의 다른 제안을 사용 했습니다 . 우리는 또한 Firebase의 원격 구성 을 사용하여이 작업을 시도 했지만 실제로이 목적에 적합하지 않다는 것을 발견했습니다.

우리 는 오픈 소스 인 Bullet Train 이라는 자체 버전을 개발했습니다 . 기능 플래그 / 토글과 원격 구성을 모두 결합합니다.


4

기능 플래그는 여러 목적으로 사용됩니다. 일반적인 아이디어는 어떤 사용자가 어떤 기능을 볼 수 있는지에 대한 제어를 원격 대시 보드 또는 일종의 백 오피스에 위임하는 것입니다.

코드에서 기능에 플래그가 지정되면 이제 몇 가지 방법을 사용하여 응용 프로그램에서 볼 수있는 사용자를 결정할 수 있습니다. 1. 켜기 / 끄기 -모든 사용자에게 기능을 표시하거나 전혀 표시하지 않습니다. 2. 점진적 출시 -일부 사용자에게만 기능을 표시 한 다음 점차 모든 사용자에게 표시합니다. 3. 타겟팅 -해당 사용자의 속성 또는 특성에 따라 특정 사용자에게 기능을 표시합니다.

기능 플래그 (부울) 및 기능 구성 (문자열, 숫자 등)을 제어하는 ​​데 도움이되는 도구를 일반적으로 기능 관리 플랫폼 이라고합니다. Configz.io 라는 기능 관리를위한 훌륭한 서비스가 있습니다.


3

코딩 관점에서 기능 플래그는 if작성중인 새 코드를 감싸는 명령문 처럼 간단 할 수 있습니다 . if문이 참으로 평가 되면 (기능 플래그가 켜짐) 새 코드가 실행됩니다.

소프트웨어를 제공하는 실제 사례에서 if 위에서 설명한 설명은 소프트웨어가 실행되는 환경에 따라 다르게 평가됩니다. 예를 들어 애플리케이션이 QA 서버에서 실행되는 경우 기능 플래그는 true를 반환하고 새 기능은 다음과 같습니다. 본. 프로덕션 서버에서 실행중인 경우 기능 플래그가 false를 반환하고 기능이 숨겨집니다.

경력을 쌓는 동안 개인적인 경험을 통해 다음과 같은 방식으로 기능 플래그를 사용했습니다.

  1. 고객에게 기능 출시에서 코드 배포를 분리합니다. 개발 프로세스에서 처음으로 기능 플래그를 사용했습니다. 우리는이를 사용하여 마케팅 및 제품 팀과 개발 및 릴리스를 수행하는 엔지니어링 팀 간의 종속성을 제거했습니다. 기능 플래그를 사용하면 출시 몇 주 전에 코드를 배포 할 수 있었지만 이전에는 릴리스 전날 밤에 코드를 배포했습니다!

  2. 프로덕션 테스트. 코드를 출시 할 때 기능 플래그를 사용하기 전에는 모든 고객이 기능을 얻거나받지 않은 모든 이벤트가 발생했습니다. 기능 플래그를 사용하여 한 번에 소수의 사용자에게 새로운 기능을 배포 할 수있었습니다. 이를 통해 전체 고객 기반에 잠재적 인 문제를 일으키지 않고 새로운 기능에 대한 귀중한 피드백과 데이터를 수집 할 수있었습니다.

  3. 개발 수명주기에서 환경 별 기능 활성화 / 비활성화. 우리는 훨씬 더 원활한 배포 프로세스를 위해 개발 과정에서이를 광범위하게 사용했습니다. 기능 플래그를 사용하는 것이 중요한 CI / CD 파이프 라인이 있습니다.

  4. 킬 스위치 생성. 응용 프로그램의 특정 기능을 기능 플래그로 래핑하여 당시 응용 프로그램에 문제가 발생한 경우 해당 기능을 '종료'할 수 있습니다. 예를 들어 부하가 많은 경우 웹 사이트의 중요하지 않은 특정 기능을 해제하여 문제를 해결할 수 있습니다.

여기에서 기능 플래그에 대해 자세히 알아볼 수 있습니다 .

여러 가지 방법으로 코드에 기능 플래그를 추가 할 수 있습니다.

  1. 직접 만들거나 타사 기능 플래그 라이브러리를 사용하고 배포 패키지에 포함될 수있는 구성 파일에 기능 플래그 데이터를 추가 할 수 있습니다.
  2. 직접 만들거나 타사 기능 플래그 라이브러리를 사용하고 런타임에로드 할 수있는 구성 파일에 기능 플래그 데이터를 추가 할 수 있습니다.
  3. 클라우드 기반 기능 플래그 관리 서비스를 사용하여 필요한 모든 기능 플래그를 관리 할 수 ​​있습니다.

자신의 라이브러리를 작성하는 것은 처음에는 좋은 생각처럼 보일 수 있으며 일반적으로 그렇게 시작할 수 있습니다. 그러나 일부 사용자에게 배포하거나 특정 사용자 그룹을 대상으로하는 것과 같은 기능 플래그의 고급 사용 사례를 구현하려는 경우 곧 문제가 발생할 수 있습니다. 고유 한 기능 플래그 구현을 만드는 또 다른 문제는 여러 언어를 사용하는 경우 코드를 여러 번 구현해야한다는 것입니다.

기능 플래그를 사용하는 가장 쉽고 쉬운 방법은 Floodgate 와 같은 온라인 기능 플래그 관리 서비스를 사용하는 것 입니다. 이렇게하면 모든 무거운 작업에 플랫폼을 활용할 수 있으므로 애플리케이션의 기능을 만드는 데 집중할 수 있습니다.

다음은 .NET SDK를 사용하여 애플리케이션에 Floodgate 기능 플래그를 추가하는 방법의 예입니다.

using FloodGate.SDK;

var floodgateClient = new FloodGateClient("API-KEY");

var flag = floodgateClient.GetValue("a-new-feature", false);

if (flag)
{
  // Execute the code for my new feature here...
}

개발 팀에서 작업 중이고 기능 플래그를 사용하지 않고 팀 내 배포 및 코드 관리에 문제가있는 경우. 기능 플래그를 사용하면 이러한 문제를 해결할 수 있습니다. 팀 개발 속도를 높이는 기능 플래그의 좋은 부작용도 있습니다.

Martin Fowler는 여기 에서 읽을 것을 권장하는 기능 플래그에 대한 매우 심층적 인 글을 제공합니다 .


2

내 이해는 기능 플래그가 특정 기능을받는 사용자를 결정하여 기능을 제어하는 ​​데 도움이된다는 것입니다.

예를 들어 베타 사용자에게만 새로운 기능이 표시되기를 원한다고 가정 해 보겠습니다. 베타 사용자의 경우 해당 기능을 "토글"하면 나머지 사용자에게는 표시되지 않습니다.

LDUser user = new LDUser("user@test.com");

boolean showFeature = ldClient.toggle("your.feature.key", user, false);

if (showFeature) {
     // application code to show the feature 
 }
else {
     // the code to run if the feature is off
 }

내가 테스트하고있어 LaunchDarkly의 기능 플래그를 일부 프런트 엔드 JS A / B 테스트를 위해 - 잘 작동하는 것 같군. 이 사이트에서 기능 토글 및 기능 플래그 라이브러리를 확인할 수도 있습니다 .


1

기능 플래그는 기본적으로 코드를 변경하거나 새 버전을 릴리스하지 않고도 기능을 켜고 끌 수있는 기능을 제공합니다. 사용자가 애플리케이션을 새 버전으로 업데이트 할 수있는 권한이 없기 때문에 모바일 애플리케이션 개발자에게 특히 중요한 솔루션입니다.

모바일 애플리케이션 개발자를 위해이 서비스를 제공하는 여러 회사가 있습니다.


이것들을 조심하십시오. PROD 가시성 / 통합에서 여러 기능을 숨기는 데 사용할 수있는 간단한 스위치를 만들기 위해 이러한 서비스 중 하나를 통합 할 필요가 없습니다. 또한이 작업을 반드시 실시간으로 수행 할 필요 는 없습니다. PROD 배포가 단 몇 분이면 배포를 기다리는 것은 큰 문제가 아닙니다 (다른 여러 이유로 최적화해야 함).
Matt Kocaj

2
여기에 추가로 현재 최고의 기능 플래그 서비스를 비교합니다. featureflagservices.io
sige

1

우리 회사에서는 SaaS 앱에서 소개하는 모든 새로운 기능에 대해 기능 플래그를 사용합니다. 성능에 대한 이점 외에도 새로운 기능을 점진적으로 출시 할 수 있습니다. 먼저 고급 사용자에게 새로운 기능을 도입하고, 모든 사용자에게 배포하기 전에 피드백을 받고, 즉석에서 개선 할 수 있습니다.

또한 개별 사용자에게 오퍼링을 사용자 정의 할 수 있습니다. 고급 사용자는 모든 기능을 원합니다. 단순한 사용자는 기본적인 것을 원할 수도 있고 강력하고 복잡한 모든 기능에 혼동 될 수도 있습니다. 또한 영업 팀이 상향 판매 할 수 있습니다.

물론 다른 사람들이 지적했듯이 기능이 성능 저하를 유발하는 경우 해당 기능을 간단히 해제 할 수 있습니다 (모든 클라이언트 또는 문제를 일으키는 한 클라이언트).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.