Що таке "прапор функції"?


115

Тут розміщені прапори високої масштабованості :

5 речей, токсичних для масштабованості , "5. Нестача функціональних прапорів"

Що саме є прапорцями?


1
Як зазначає Максим Векслер, ця публікація Flickr є однією з канонічних, ранніх статей про функціональні прапори, і детально пояснює їх використання та реалізацію code.flickr.com/blog/2009/12/02/flipping-out
Ной Суссман

Відповіді:


104

"Прапор функції" (або Feature Toggle ) - це можливість легко / легко вмикати / вимикати функції (підрозділи) вашої програми:

  • можливо, через повторну розгортання, або
  • деяку внутрішню сторінку, на якій сторінки / функції можна перемикати наживо.

Я припускаю, що на прикладі було те, що зручно мати контроль, щоб дещо зменшити набір функцій, якщо вам потрібно, скажімо, зменшити запити db, якщо навантаження занадто велика.

Існує маса інших причин, якими ви хочете скористатися цим - одна з головних в тому, що дозволяє безперервна доставка : підштовхування речей у виробництво / живе, але функція відключена / вимкнена, поки її не буде завершено. Ми часто використовуємо те, що ми називаємо «файлом cookie», щоб показувати незавершені функції лише команді розробників. Таким чином, ми можемо перевірити частково завершені роботи у виробництві (о, так, чи є краща інтеграція?) За допомогою декількох випусків / розгортань, перш ніж ми “переключимося” (завершимо) це і стане зрозумілим для публіки.

Ось простий пакет, який допоможе вам це зробити на землі ASP.NET MVC: https://github.com/cottsak/DevCookie (повне розкриття: я автор)

Фаулер також має набагато довшу статтю, ніж та, що пов'язана вище, із значно більше деталями .

У цій публікації (також на веб-сайті Фоулера) пояснюються різні типи стратегій перемикання . DevCookie підтримує стратегію на основі основної лінії / магістралі і називається в статті " Release Toggle ".

Відповідь Аділа підкреслює, що існує багато термінів і причин, чому ви можете захотіти частину цієї інфраструктури. Майте на увазі, що вам можуть знадобитися лише деякі з цих речей. Наприклад, я, можливо, хочу лише активувати простий та спритний робочий процес розгортання / доставки, і тому простої інфраструктури буде достатньо. Якщо після цього ви вибираєте ви хочете перейти в повну #leanstartup експерименти з A / B, тестуванням когорти і такими речами , як контрольоване розгортання, ви повинні розглянути інструмент аналітики (наприклад , Heap ) , що полегшує ці методології розробки керованих даних в якості окремого рішення . Інфраструктура тумблера, яка виконує все вищезазначене, призведе до розриву та непотрібності.

Якщо ви зробили це так далеко, то, можливо, ви хочете перевірити деякі інші мої думки щодо розвитку основних напрямків, переключення функцій та інших дурних ідей, таких як TEST, QA, SIT, STAND, CROUCH .


1
Як не дивно, я завжди уявляв одне й те саме в тому, що будував. Це може бути настільки ефективною ознакою.
GurdeepS

7
Часто ви знайдете подібні речі, які здаються очевидними. Виявляється, хтось завжди придумав його ім'я.
Метт Кокай

27

Прапор функції - це метод вимкнення певної функціональності вашої програми за допомогою конфігурації без розгортання нового коду.

Функційні прапори відіграють ключову роль у схемі CI, де функції постійно впроваджуються, але не обов'язково «випускаються» у виробництво.

Більше інформації тут:

- EDIT:

Особливості реалізації прапорів Java .


3
Це добре описано у «Безперервному впровадженні» і є значною мірою вимогою для розвитку «основної лінії». Замість того, щоб розгалужувати в SCM функції, функції включаються або вимикаються, що дозволяє випускати код із функціями, які ще не повинні бути включені.
Чіп Маккормік

Лише зауваження про "через конфігурацію, без розгортання нового коду": виявляється, що оператор означає зміну конфігурації та повторне розгортання програми (навіть тому, що код не змінився). Це може зайняти від секунд до хвилин, залежно від вашого конвеєра розгортання. Прапор функції або перемикання функцій може не зберігатися в конфігурації. Це може бути десь у магазині / db і поводити себе "наживо" - тобто, переходити до певної сторінки адміністратора, де ви натискаєте на кнопку, щоб миттєво ввімкнути деяку поведінку на всьому сайті (без розгортання, зміни конфігурації).
Метт Кокай

1
Я працюю на ConfigCat.com, і те, як я бачу це "зміна конфігурації без розгортання нового коду", означає, що конфігу подається службою прапора функції, а ваша програма отримує доступ до значень, перетягуючи цей конфігураційний файл. Таким чином ви можете бути впевнені, що для зміни значення не потрібен який-небудь вид повторного розгортання програми. Крім того, це дозволяє створювати правила, щоб ви надавали значення одному користувачеві, а іншому - іншому. cool - це вся оцінка прапора функції на стороні клієнта, і вся ця логіка працює без необхідності відштовхувати будь-які дані назад до служби прапора функції.
SiGe


19

Прапори функцій, перемикання функцій, експерименти та керовані розгортання є синонімами простої, але потужної ідеї: окремий код розгортається від розкрутки функцій. Простіше кажучи, це можливість підштовхувати свої функції до виробництва, вибираючи, хто з ваших клієнтів - якщо хто взагалі - бачить цю функцію.

Вони частково були популяризовані "Воротником Facebook" . Ще один хороший приклад - LiX LinkedIn.

Прийняття цієї простої ідеї закладає основу для багатьох найкращих практик, включаючи:

Безперервне розгортання / доставка - декілька кодів підштовхують до виробництва за день.

Розробка магістральних і основних ліній - спеціальні гілки повинні створюватися лише для запитів на витяг, а не для довготривалої розробки функцій.

Немає більше випуску поїздів, щоб заблукати речі.

Тестування якості / перфекту випробувань на виробництві - справжнє тестування якості та ефективності проводиться на виробничій інфраструктурі з виробничим трафіком. Не витрачайте час на створення широких лабораторій та постановочних середовищ.

Експерименти - дізнайтеся, як нова функція переміщує голку на ваші KPI.

Уникнення виправлень або відкодів коду, коли виникають проблеми - і виправлення, і відкази коду є стресовими, потребують тривалого часу та призводять до появи більше проблем, ніж потрібно. Натомість вимкніть цю функцію або зменшіть її.

Інші згадали про бібліотеки з відкритим кодом. Хороший приклад повноцінного рішення - як Gatekeeper та LiX - це Спліт . Я працюю на Спліт.


Я думаю, що важливо не пов'язувати прапорці функції виключно для підтримки віршів CI AB / когорта / худорляві експерименти - цілі різні. Наприклад, використання перемикання функцій для отримання чого-небудь в Prod for QA / accept може бути простим інструментом для допомоги CI / CD, і в такому випадку Split може бути зайвим. Знову ж таки, якщо ви хочете зробити експерименти з обмеженою швидкістю або тестування A / B, то, можливо, вам потрібен хороший інструмент аналітики, як Heap, з додатковими вбудованими інструментами та телеметричною звітністю. Мені не подобається ідея об'єднання цих двох цілей - здається, вам міг роздуватися дуже легко.
Метт Кокай

14

Тут є дуже багато чудових відповідей, і всі вони керуються важливим базовим визначенням, популяризованим у посту Мартіна Фаулера :

Вони є бітами коду, які "[дозволяють] командам змінювати поведінку системи без зміни коду."

Отже, ми історично думали про них як про представлений псевдокодом:

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

Це абсолютно точний спосіб подумати про це, і Метт, і Аділ чудово розширюють це, використовуючи різноманітні тактичні випадки використання для прапора.

Але я хотів би запропонувати переглянене визначення, яке відображає, як реальність розвивалася за шість років та зміни, оскільки дотнетдев задав оригінальне запитання. Я працюю в Rollout.io , платформі з особливими прапорцями, тому у мене було місце для переднього ряду для цієї еволюції.

Простіше кажучи, прапорці функцій вже не є лише способом вмикати та вимикати біти функціональності у вашій програмі. Це як відповісти "що таке позиція рахунка-фактури", сказавши "це опис та кількість валюти". Щоправда, але він не рухається в більш широкій точці самого рахунку-фактури.

Особливості прапорів - це тактичні біти всебічного стратегічного рішення в сучасному програмному забезпеченні. Вони є засобом, за допомогою якого ви відкладаєте важливу логіку рішення у своєму коді до часу виконання, коли у вас є більше інформації. І, мабуть, найголовніше, вони більше не виникають ізольовано, за допомогою однієї перевірки, чи є номер версії більше 2,7 чи ні; організації, що використовують їх, як правило, включають їх як частину всебічного, загальносистемного підходу до продукції.

Як вже згадували інші, Facebook та LinkedIn стали першими на цьому, але в 2018 році це робить чимало організацій. Вони відкладають питання логіки прийняття рішень під час виконання як частина стратегії розвитку, стратегії роботи (або, якщо ви хочете, стратегії DevOps) та продуктової стратегії. Ось приклади таких питань.

  • Хто повинен бачити новий екран адміністратора, який ми розгортаємо, і коли?
  • Який рівень членства необхідний для розблокування цього писанка?
  • Коли ми повинні переключитися на нову базу даних?
  • Чи слід розміщувати зображення кнопки гепарду або орла на кнопці оформлення замовлення, щоб підвищити кількість конверсій?

Щоб мати програму, яка відкладає значну кількість таких рішень до часу виконання, ви не можете кидати спеціальні прапори у свою програму в спеціальному режимі, або ви поховати себе в технічній заборгованості. У наші дні вам потрібно розробити загальну стратегію управління прапорцями, яка включає кілька різних компонентів.

  • Переключення точок використовується для переключення поведінки на нові функції.
  • Кілька точок перемикання об'єднуються, утворюючи маршрутизатор . Перемикач маршрутизатора визначає стан функції.
  • Контекст Toggle надає маршрутизатору переключення необхідну контекстну інформацію (наприклад, конкретного користувача).
  • Конфігурація Toggle забезпечує інформацію про перемикач маршрутизатора про навколишнє середовище.

Отже, врешті-решт, що таке прапорці?

Що ж, вони є важливою частиною більш широкої стратегії створення програми, яка адаптована як до технічних, так і до потреб ринку.


9

Прапор функції (також відомий як перегортання функції або перемикання функції ) - це перемикач, щоб увімкнути або вимкнути потенційно дорогу функцію за необхідності (наприклад, коли сайт забивається несподіваним трафіком). Це дозволить вам придбати трохи часу, поки ви не збільшите масштаб або до того, як сплеск навантаження не піде.

Ось приклад із документації SWIG .


6
Це одне використання прапорів функцій, так, але основна концепція, яку потрібно розуміти, полягає в тому, що вони роз’єднують випуск функції та розгортання коду, так що ви можете випускати функції коли завгодно, замість того, коли код надходить. Це наріжний камінь постійної інтеграції.
Ерік Елліотт

6

У моїй компанії ми мали для цього власне рішення. Ми створили сервіс, який надає файл config ( .json) для завантаження для кожного додатка. У цій конфігурації ми зберігали прапори для функцій. На основі цієї конфігурації додаток може показувати або приховувати поточну функцію. (Наприклад, показати або приховати пункт меню на бічній панелі).

Ми також створили внутрішню сторінку адміністратора, де ми можемо налаштувати прапорці функції. Деякий час він працював досить добре, але після цього нам би хотілося зробити націлювання на користувачів та тестування A / B. Розвиватися самостійно Здавалося, занадто багато зусиль, тому ми обрали сторонне рішення. Як вже було сказано тут, для цього існує багато рішень.

Ми вибрали ConfigCat, оскільки він підтримує індивідуальні цільові групи та розроблення на основі відсотків одночасно. Ви можете перевірити підтримувані sdks з відкритим кодом на github .


4

Прапори функцій (або перемикання функцій) дозволяють увімкнути функції віддалено в додатку, не потребуючи повторного збирання / повторного розгортання програми. Це дозволяє розгорнути код до виробництва, але не випустити функцію, поки ви не будете готові. Ви можете орієнтуватися на конкретних користувачів, щоб ви могли включити нову функцію для бета-користувачів для тестування.

У нашій компанії раніше ми використовували LaunchDarkly та інші пропозиції від FeatureFlags.io . Ми також спробували скористатися віддаленою конфігурацією Firebase, щоб спробувати зробити цю роботу, однак ми виявили, що вона не зовсім підходить для цієї мети.

Ми закінчили розробляти власну версію під назвою Bullet Train , яку ми відкрили. Він поєднує в собі як функціональні прапори / перемикачі, так і віддалене налаштування.


4

Функціональні прапори використовуються для декількох цілей. Загальна ідея полягає в тому, щоб делегувати контроль над тим, який користувач бачить яку функцію на якійсь віддаленій приладовій панелі або якомусь бек-офісі.

Після позначення функції в коді тепер ви можете використовувати декілька методів, щоб визначити, хто користувач бачить її у вашій програмі: 1. Увімкнено / вимкнено - показати цю функцію всім або нікому з ваших користувачів. 2. Поступовий випуск - показуйте цю функцію лише відсотку користувачів, а потім поступово показуйте її всім користувачам. 3. Націлювання - показуйте функцію конкретним користувачам на основі властивостей або характеристик цього користувача.

Інструменти, які допомагають контролювати прапори функцій (булеві) та конфігурації функцій (рядки, цифри тощо), зазвичай називаються платформами управління функціями. Існує чудовий сервіс для управління функціями під назвою Configz.io


3

З точки зору кодування, прапор функції може бути таким же простим, як і ifзаява, яка обертається навколо нового фрагмента коду, який ви пишете. Коли ifоператор оцінить як істинне (прапор функції включений), новий код буде виконаний.

У реальному прикладі надання програмного забезпечення, ifописане вище твердження буде оцінюватися по-різному залежно від середовища, в якому працює програмне забезпечення. Наприклад, якщо програма виконується на вашому QA-сервері, прапор функції повернеться істинним, а нова функція буде видно. Якщо він виконується на виробничому сервері, прапор функції поверне помилкове значення, а функція буде прихована.

З мого особистого досвіду під час своєї кар'єри я використовував прапорці за характеристиками наступними способами:

  1. Роз'єднання розгортання коду від надання можливостей клієнтам. Це було моє перше початкове використання функціональних прапорів у нашому процесі розробки. Ми використовували його для усунення залежності між нашою командою з маркетингу та продуктів та інженерною командою, яка займалася розробкою та випусками. Функції прапорів дозволили нам розгорнути наш код за тиждень до запуску, тоді як раніше ми розгортали код за ніч до випуску!

  2. Тестування у виробництві. Перш ніж ми використовували прапори функцій, коли ми випускали наш код, це була подія все або нічого, або всі наші клієнти отримали цю функцію, або ніхто з них не зробив. Ми використовували прапорці функцій, щоб дозволити нам розгорнути нову функцію для невеликого відсотка користувачів одночасно. Це дозволило нам зібрати цінні відгуки та дані про нову функцію, не ризикуючи будь-якими потенційними проблемами для всієї бази клієнтів.

  3. Увімкнення / вимкнення функції для середовища в життєвому циклі розвитку. Ми широко використовували це в розробці, щоб дозволити набагато більш плавний процес розгортання - у нас є конвеєр CI / CD, в якому використання функціональних прапорів є життєво важливим.

  4. Створення перемикача "kill". Ми обклали певні функції нашої програми прапором, який дозволяє нам "вбити" цю функцію в разі виникнення будь-яких проблем із програмою. Наприклад, якщо ми опинилися під великим навантаженням, ми можемо вимкнути деякі несуттєві функції веб-сайту, щоб допомогти у вирішенні проблеми.

Докладніше про прапорці функцій можна прочитати тут.

Ви можете додати прапори функцій у свій код кількома способами.

  1. Ви можете створити власну або використати сторонній бібліотеку прапорів функцій та додати дані свого прапора функції у файл конфігурації, який може бути включений у ваш пакет розгортання.
  2. Ви можете створити власну або використати сторонній бібліотеку прапорів функцій та додати дані свого прапора функції у конфігураційний файл, який можна завантажувати під час виконання.
  3. Ви можете використовувати хмарну службу управління прапорами функцій, щоб керувати всіма необхідними для вас прапорцями функції.

Написання власної бібліотеки може спочатку здатися гарною ідеєю, і зазвичай це може початися саме так. Однак незабаром ви можете зіткнутися з проблемами, коли хочете реалізувати більш досконалі випадки використання прапорців функцій, таких як розгортання певного відсотка користувачів або націлювання на певні групи користувачів. Ще одна проблема зі створенням власної реалізації функції прапорця - якщо ви використовуєте кілька мов, вам потрібно буде кілька разів реалізувати код.

Найкращий і найпростіший спосіб використання прапорців функцій - це використання онлайн-сервісу управління прапорами, наприклад Floodgate . Таким чином, ви можете скористатися на платформі всім важким підйомом, який потім дозволяє зосередитись на створенні функції для вашої програми.

Ось приклад того, як додати прапор функції Floodgate до програми за допомогою .NET SDK.

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...
}

Якщо ви працюєте в команді розробників, і ви не використовуєте прапори функцій, і у вас виникають проблеми з розгортанням та керуванням кодом всередині команди. Використання функціональних прапорів може бути чудовим способом вирішення цих проблем. Також є приємний побічний ефект функціональних прапорів, що прискорюють швидкість розвитку ваших команд.

Мартін Фаулер дає дуже глибоке написання тут функціональних прапорів, які рекомендую вам прочитати.


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 тільки хвилин (які ви повинні оптимізують для для багатьох багатьох інших причин).
Метт Кокай

2
На додаток тут це порівняння кращих послуг прапор поточного об'єкта: featureflagservices.io
SiGe

1

У моїй компанії ми використовуємо прапорці функцій для кожної нової функції, яку ми представляємо в нашому додатку SaaS. Окрім переваг для продуктивності, він також дозволяє поступово впроваджувати нові функції - спочатку впроваджуючи нові функції для енергетичних користувачів, отримуючи від них зворотній зв'язок та імпровізуючи їх, перш ніж ми зможемо розгорнути їх усім користувачам.

Це також дозволяє нам налаштувати пропозицію для окремих користувачів - користувачі, які користуються потужністю, бажають усіх функцій; прості користувачі можуть просто захотіти основні речі і можуть заплутатися у всіх потужних складних функціях. Це також дозволяє нашій торговій команді збільшувати продаж.

І звичайно, як зазначали інші, якщо ми виявимо, що функція спричиняє погіршення продуктивності, ми можемо просто вимкнути цю функцію (або для всіх клієнтів, або для одного клієнта, який викликає проблему).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.