Что такое «флаг функции»?

115

Здесь High Scalability упоминает флаги функций:

5 вещей, отравляющих масштабируемость : «5. Отсутствие флагов функций»

Что такое флаги функций?

GurdeepS
источник
1
Как отмечает Максим Векслер, этот пост на Flickr является одной из канонических ранних статей о флагах функций и довольно подробно объясняет их использование и реализацию code.flickr.com/blog/2009/12/02/flipping-out
Noah Sussman

Ответы:

105

«Флаг функции» (или Переключатель функций ) - это возможность легко включать и отключать функции (подразделы) вашего приложения:

  • возможно, через повторное развертывание или
  • некоторая внутренняя страница, на которой страницы / функции можно переключать вживую.

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

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

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

У Фаулера также есть гораздо более длинная статья, чем та, что указана выше, с гораздо большим количеством деталей .

В этом сообщении (также на сайте Фаулера) объясняются различные типы стратегий переключения . DevCookie поддерживает стратегию mainline / trunk и в статье называется « Release Toggle ».

Ответ Адиля подчеркивает, что существует множество терминов и причин, по которым вам может понадобиться некоторая часть этой инфраструктуры. Имейте в виду, что вам могут понадобиться только некоторые из этих вещей. Например, мне может понадобиться только включить простой и гибкий рабочий процесс развертывания / доставки, поэтому простой инфраструктуры будет достаточно. Если вы затем решите перейти к полному экспериментированию #leanstartup с A / B, когортным тестированием и такими вещами, как контролируемое развертывание, вам следует рассмотреть инструмент аналитики (например, Heap ), который упрощает эти методологии разработки на основе данных, как отдельное решение. . Инфраструктура переключения, которая выполняет все вышеперечисленное, приведет к раздуванию и ненужной сложности.

Если вы зашли так далеко, то, возможно, вам захочется ознакомиться с некоторыми из моих других мыслей по поводу основной разработки, переключения функций и других глупых идей, таких как ТЕСТ, QA, SIT, STAND, CROUCH .

Мэтт Кодж
источник
1
Как ни странно, я всегда представлял одно и то же во всем, что строил. Это может быть такой эффективной функцией.
GurdeepS
7
Часто такие вещи кажутся очевидными. Оказывается, кто-то всегда придумывал ему название.
Мэтт Кодж
27

Флаг функции - это метод отключения некоторых функций вашего приложения с помощью конфигурации без развертывания нового кода.

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

Больше информации здесь:

-- РЕДАКТИРОВАТЬ:

Реализация Java-флагов функций .

Максим Векслер
источник
3
Это хорошо описано в разделе «Непрерывное развертывание» и в значительной степени является требованием для «основной» разработки. Вместо того, чтобы разветвляться в SCM для функций, функции включаются или выключаются, что позволяет выпускать код с функциями, которые еще не должны быть включены.
Chip McCormick
Просто примечание о «через конфигурацию, без развертывания нового кода»: похоже, что инструкция означает изменение конфигурации и последующее развертывание приложения (даже если код не изменился). Это может занять от секунд до минут в зависимости от вашего конвейера развертывания. Флаг функции или переключатель функции не могут сохраняться в config. Он может быть где-то в хранилище / базе данных и вести себя «в реальном времени» - то есть переходить на какую-то страницу администратора, где вы нажимаете кнопку, чтобы мгновенно включить какое-то поведение в масштабах всего сайта (без развертывания, без изменения конфигурации).
Мэтт Кодж
1
Я работаю на ConfigCat.com, и то, как я его вижу, «изменение конфигурации без развертывания нового кода» означает, что конфигурации обслуживаются службой флагов функций, и ваше приложение получает доступ к значениям, извлекая этот файл конфигурации. Таким образом, вы можете быть уверены, что изменение значения не требует повторного развертывания приложения. Вдобавок к этому он позволяет создавать правила, чтобы вы предоставляли ценность одному пользователю, а другую - другому. Круто - вся оценка флагов функций выполняется на стороне клиента, и вся эта логика работает без необходимости отправлять какие-либо данные обратно в службу флагов функций.
sige 02
techblog.outbrain.com/tag/feature-flags - URL не работает
Sathish
19

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

Частично их популяризировал Gatekeeper Facebook . LiX от LinkedIn - еще один хороший пример.

Принятие этой простой идеи закладывает основу для многих передовых практик, в том числе:

Непрерывное развертывание / доставка - запуск нескольких кодов в рабочую среду за день.

Trunk / Mainline Development - ветки функций должны создаваться только для запросов на вытягивание, а не для долговременной разработки функций.

Больше никаких поездов по выпуску, чтобы увязнуть.

QA / Perf Testing in Production - настоящее тестирование QA и производительности проводится в производственной инфраструктуре с производственным трафиком. Не тратьте время на создание обширных лабораторий производительности и промежуточных сред.

Экспериментируйте - узнайте, как новая функция перемещает стрелку ваших KPI.

Избегайте исправлений или откатов кода при возникновении проблем - исправления и откаты кода вызывают стресс, занимают много времени и приводят к большему количеству проблем, чем необходимо. Вместо этого выключите эту функцию или уменьшите ее.

Другие упомянули библиотеки с открытым исходным кодом. Хорошим примером полного решения, такого как Gatekeeper и LiX, является Split . Я работаю в Сплите.

Адиль Айджаз
источник
Я думаю, что важно не объединять флаги функций исключительно для поддержки экспериментов AB / когортного / бережливого CI по сравнению с CI - цели разные. Например, использование переключателя функций для ввода чего-либо в Prod для контроля качества / принятия может быть простым инструментом для помощи CI / CD, и в таком случае Split может быть излишним. Опять же, если вы хотите проводить бережливые эксперименты или A / B-тестирование, вам, возможно, понадобится хороший инструмент аналитики, такой как Heap, со встроенными дополнительными инструментами и телеметрическими отчетами. Мне не нравится идея объединения этих двух целей - похоже, вы может очень легко раздуваться.
Мэтт Кодж
14

Здесь есть много отличных ответов, основанных на важном базовом определении, популяризированном в сообщении Мартина Фаулера :

Это фрагменты кода, которые «[позволяют] командам изменять поведение системы без изменения кода».

Итак, мы исторически думали о них как о псевдокоде:

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

Это совершенно точный способ думать об этом, и Мэтт и Адил прекрасно дополняют его, предлагая множество тактических вариантов использования флага функции.

Но я хотел бы предложить пересмотренное определение, которое отражает, как реальность развивалась за шесть лет и изменилась с тех пор, как dotnetdev задал исходный вопрос. Я работаю на Rollout.io , платформу с флажками функций, так что у меня было место в первом ряду для этой эволюции.

Проще говоря, флаги функций - это уже не просто способ включать и отключать некоторые функции в вашем приложении. Это все равно, что ответить «что такое строка счета-фактуры», сказав «это описание и сумма валюты». Верно, но это не касается самого счета-фактуры в более широком смысле.

Флаги функций - это тактические элементы всеобъемлющего стратегического решения в современном программном обеспечении. Они являются средством, с помощью которого вы откладываете важную логику принятия решений в своем коде до времени выполнения, когда у вас будет больше информации. И, что, возможно, наиболее важно, они больше не происходят просто изолированно, с единственной проверкой, чтобы узнать, больше ли номер версии 2.7 или нет; организации, которые их используют, обычно включают их как часть комплексного общесистемного подхода к продукту.

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

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

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

  • Точки переключения используются для переключения поведения для новых функций.
  • Несколько точек переключения объединяются, образуя переключаемый маршрутизатор . Переключаемый маршрутизатор определяет состояние функции.
  • Toggle context предоставляет переключаемому маршрутизатору необходимую контекстную информацию (например, конкретного пользователя).
  • Конфигурация Toggle предоставляет переключателю маршрутизатора информацию о среде.

Итак, в конце концов, что такое флаги функций?

Что ж, они являются важной частью более широкой стратегии создания приложения, которое можно адаптировать как к техническим, так и к рыночным потребностям.

Эрез Росовский
источник
9

Флаг функции (также известный как переключение функций или переключение функций ) - это переключатель, позволяющий включать или отключать потенциально дорогостоящую функцию по мере необходимости (например, когда на сайт забивается неожиданный трафик). Это даст вам немного времени, пока вы не увеличите масштаб или пока не исчезнет скачок нагрузки.

Вот пример из документации SWIG .

Майкл Петротта
источник
6
Это одно из применений флагов функций, да, но важно понимать, что они разделяют выпуск функций и развертывание кода, так что вы можете выпускать функции, когда захотите, а не всякий раз, когда код доставляется. Это краеугольный камень непрерывной интеграции.
Эрик Эллиотт
6

В моей компании для этого было собственное решение. Мы создали сервис, предоставляющий загружаемый файл config ( .json) для каждого приложения. В этой конфигурации мы сохранили флаги для функций. На основе этой конфигурации приложение может отображать или скрывать текущую функцию. (Например, показать или скрыть пункт меню на боковой панели).

Мы также создали внутреннюю страницу администратора, где мы можем настроить флаги функций. Некоторое время это работало неплохо, но после этого мы хотели бы провести таргетинг на пользователей и A / B-тестирование. Самостоятельная разработка Казалось слишком трудоемким, поэтому мы выбрали стороннее решение. Как уже упоминалось здесь, для этого есть много решений.

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

понедельник
источник
4

Флаги функций (или переключатели функций) позволяют удаленно включать функции в приложении без необходимости повторной сборки / повторного развертывания приложения. Это позволяет вам развернуть код в производственной среде, но не выпускать функцию, пока вы не будете готовы. Вы можете настроить таргетинг на конкретных пользователей, чтобы вы могли включить новую функцию для тестирования бета-пользователями.

В нашей компании мы ранее использовали LaunchDarkly и другие предложения от FeatureFlags.io . Мы также пытались использовать удаленную конфигурацию Firebase, чтобы попытаться выполнить эту работу, но мы обнаружили, что она не совсем подходит для этой цели.

В итоге мы разработали нашу собственную версию под названием Bullet Train , исходный код которой был открыт. Он сочетает в себе как флаги / переключатели функций, так и удаленную конфигурацию.

TStu
источник
4

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

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

Инструменты, которые помогают контролировать флаги функций (логические значения) и конфигурации функций (строки, числа и т. Д.), Обычно называются платформами управления функциями. Существует отличный сервис для управления функциями под названием Configz.io.

Монады похожи на ...
источник
3

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

В реальном примере доставки программного обеспечения ifописанный выше оператор будет оцениваться по-разному в зависимости от среды, в которой работает программное обеспечение. Например, если приложение выполняется на вашем сервере контроля качества, флаг функции вернет true, а новая функция будет видел. Если он выполняется на вашем производственном сервере, флаг функции вернет false, и функция будет скрыта.

Исходя из моего личного опыта в течение моей карьеры, я использовал флаги функций следующим образом:

  1. Отделение развертывания кода от предоставления функций клиентам. Это было мое первое первоначальное использование флагов функций в процессе разработки. Мы использовали его, чтобы устранить зависимость между нашей маркетинговой и продуктовой командой и командой инженеров, которая занималась разработкой и выпусками. Флаги функций позволили нам развернуть наш код за несколько недель до запуска, тогда как раньше мы развертывали код за ночь до выпуска!

  2. Тестирование в производстве. До того, как мы использовали флаги функций при выпуске нашего кода, это было событие «все или ничего»: либо все наши клиенты получили эту функцию, либо ни один из них не получил. Мы использовали флаги функций, чтобы позволить нам внедрять новую функцию для небольшого процента пользователей за раз. Это позволило нам собрать ценные отзывы и данные о новой функции, не рискуя какими-либо потенциальными проблемами для всей клиентской базы.

  3. Включение / отключение функции для каждой среды в жизненном цикле разработки. Мы широко использовали это при разработке, чтобы обеспечить более плавный процесс развертывания - у нас есть конвейер CI / CD, в котором использование флагов функций жизненно важно.

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

Вы можете узнать больше о флагах функций здесь.

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

  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 - похоже, работает хорошо. Вы также можете посетить этот сайт, чтобы узнать о переключателях функций и библиотеках флагов функций .

Hbitspark
источник
1

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

Есть несколько компаний, предоставляющих эту услугу для разработчиков мобильных приложений.

ОФК
источник
Остерегайтесь этого. Вам не нужно интегрировать одну из этих служб, чтобы создать простой переключатель, который можно использовать, чтобы скрыть несколько функций от видимости / интеграции PROD. Кроме того, не обязательно нужно делать это вживую - как в ожидании развертывания не имеет большого значения, когда развертывание PROD только минут (которые вы должны оптимизирующие для для многих многих других причин).
Мэтт Кодж
2
В дополнение здесь это сравнение лучших услуг флаг текущего объекта: featureflagservices.io
SiGe
1

В моей компании мы используем флаги функций для каждой новой функции, которую мы представляем в нашем приложении SaaS. Помимо преимуществ для производительности, это также позволяет нам постепенно внедрять новые функции - сначала вводить новые функции опытным пользователям, получать от них отзывы и импровизировать, прежде чем мы сможем внедрить их для всех пользователей.

Это также позволяет нам настраивать предложения для отдельных пользователей - опытным пользователям нужны все функции; простые пользователи могут хотеть только базовые вещи и могут быть сбиты с толку всеми мощными комплексными функциями. Это также позволяет нашему отделу продаж делать дополнительные продажи.

И, конечно же, как указывали другие, если мы обнаружим, что функция вызывает снижение производительности, мы можем просто отключить эту функцию (либо для всех клиентов, либо для одного клиента, вызывающего проблему).

Дхармендар Кумар 'DK'
источник