[architecture] “기능 플래그”란 무엇입니까?

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

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

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



답변

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

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

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

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

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

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

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

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

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


답변

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

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

여기에 더 많은 정보 :

— 편집하다:

기능 플래그 자바 구현 .


답변

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

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

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

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

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

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

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

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

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

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


답변

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

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

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

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

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

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

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

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

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

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

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

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

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

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


답변

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

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


답변

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

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

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


답변

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

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

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