Что такое "флаг функции"?
Флаги функции упоминания о масштабируемости здесь:
http://www.iheavy.com/2011/08/26/5-things-are-toxic-to-scalability/
Что такое флаги функций?
Спасибо
9 ответов
"Флажок функций" (или Переключение функций) - это возможность легко включать и выключать функции (подразделы) вашего приложения:
- возможно, через повторное развертывание, или
- некоторая внутренняя страница, где страницы / функции могут быть переключены в прямом эфире.
Я предполагаю, что в качестве примера было полезно иметь элемент управления, чтобы несколько уменьшить набор функций, если вам нужно, скажем, уменьшить количество запросов к базе данных, если нагрузка слишком высока.
Есть куча других причин, по которым вы хотели бы использовать это, одна из основных - включение непрерывной доставки: запуск вещей в производство / вживую, но с отключенной / переключаемой функцией до ее завершения. Мы часто используем то, что мы называем "cookie-файлом dev", чтобы показать незавершенные функции только команде разработчиков. Таким образом, мы можем протестировать частично завершенную работу в производственном процессе (о, да! Есть ли лучшая интеграция?) В нескольких выпусках / развертываниях, прежде чем мы "отпустим" (завершим) ее, и она станет видимой для общественности.
Вот простой пакет, который поможет вам сделать это в ASP.NET MVC land: https://github.com/cottsak/DevCookie (полное раскрытие: я автор)
У Фаулера также есть гораздо более длинная статья, чем та, что приведена выше, с гораздо большим количеством деталей.
Этот пост (также на сайте Фаулера) объясняет различные типы стратегий переключения. DevCookie поддерживает основную / магистральную стратегию и называется в статье " Release Toggle".
Ответ Адиля подчеркивает, что существует множество терминов и причин, по которым вам может понадобиться некоторая часть этой инфраструктуры. Имейте в виду, что вам могут понадобиться только некоторые из этих вещей. Например, я могу захотеть включить только простой и гибкий рабочий процесс развертывания / доставки, поэтому достаточно простой инфраструктуры. Если вы затем решите перейти к полному эксперименту #leanstartup с A/B, когортным тестированием и такими вещами, как контролируемое развертывание, вам следует рассмотреть инструмент аналитики (например, Heap), который упрощает эти методологии разработки на основе данных как отдельное решение., Инфраструктура переключения, которая выполняет все вышеперечисленное, приведет к раздутию и ненужной сложности.
Feature Flag - это метод, позволяющий отключить некоторые функции вашего приложения с помощью конфигурации без развертывания нового кода.
Флаги функций играют ключевую роль в схеме CI, где функции постоянно развертываются, но не обязательно "выпускаются" в производство.
Больше информации здесь:
- http://code.flickr.com/blog/2009/12/02/flipping-out/
- http://techblog.outbrain.com/tag/feature-flags/
-- РЕДАКТИРОВАТЬ:
Флаги функций, переключатели функций, эксперименты и управляемые развертывания являются синонимами простой, но мощной идеи: отдельный код развертывается из развертывания функций. Проще говоря, это способность подталкивать коммиты вашей функции к производству, выбирая, кто из ваших клиентов - если кто-либо вообще - получит эту функцию.
Частично они были популяризированы гейткипером Facebook. LiX LinkedIn является еще одним хорошим примером.
Принятие этой простой идеи закладывает основу для многих лучших практик, в том числе:
Непрерывное развертывание / доставка - несколько кодов запускаются в производство за один день.
Разработка магистральных линий / магистральных линий - ветви функций должны создаваться только для запросов извлечения, а не для разработки долгосрочных функций.
Больше не нужно выпускать поезда, чтобы поглотить вещи.
QA / Perf Testing in Production - настоящее QA и тестирование производительности на производственной инфраструктуре с производственным трафиком. Не тратьте время на создание обширных лабораторий производительности и постановочных сред.
Экспериментирование - узнайте, как новая функция перемещает иглу на ваших KPI.
Избегайте исправлений или отката кода при возникновении проблем - как исправления, так и откаты кода вызывают стресс, занимают много времени и приводят к большему количеству проблем, чем необходимо. Вместо этого отключите эту функцию или уменьшите ее.
Другие упоминали библиотеки с открытым исходным кодом. Хорошим примером полного решения, такого как Gatekeeper и LiX, является Split. Я работаю на Сплит.
Здесь есть много отличных ответов, все из которых основаны на важном базовом определении, которое популяризируется в посте Мартина Фаулера:
Это кусочки кода, которые "[позволяют] командам изменять поведение системы без изменения кода".
Таким образом, мы исторически думали о них как о представленных псевдокодом:
if(app_settings["beta-mode"] == "true")
showAwesomeNewGui();
else
sameOldSnoozeFeset();
Это абсолютно точный способ думать об этом, и Мэтт, и Адиль прекрасно расширяют его с помощью разнообразных тактических вариантов использования флага функции.
Но я хотел бы предложить пересмотренное определение, которое отражает то, как реальность развивалась за шесть лет и изменилась с тех пор, как dotnetdev задал оригинальный вопрос. Я работаю на https://rollout.io/, платформу флагов функций, поэтому у меня есть место в первом ряду для этой эволюции.
Проще говоря, флаги функций больше не являются просто способом включения и выключения функций в вашем приложении. Это все равно, что ответить "что такое позиция в счете-фактуре", сказав: "это описание и количество валюты". Да, но это не влияет на более широкий смысл самого счета.
Флаги функций - это тактические биты всеобъемлющего стратегического решения в современном программном обеспечении. Они являются средством, с помощью которого вы откладываете важную логику принятия решений в своем коде до времени выполнения, когда у вас есть больше информации. И, возможно, самое главное, они больше не происходят изолированно, с помощью одной проверки, чтобы увидеть, больше ли номер версии 2.7 или нет; организации, которые их используют, обычно включают их как часть комплексного, общесистемного подхода к продукту.
Как уже упоминалось, Facebook и LinkedIn первыми это сделали, но в 2018 году это сделали многие организации. Они откладывают вопросы логики принятия решений на время выполнения как часть стратегии развития, операционной стратегии (или стратегии DevOps, если хотите) и стратегии продукта. Вот примеры таких вопросов.
- Кто должен видеть новый экран администратора, который мы развертываем и когда?
- Какой уровень членства требуется, чтобы разблокировать это пасхальное яйцо?
- Когда мы должны перейти на новую базу данных?
- Должны ли мы поместить изображение гепарда или орла на кнопку оформления заказа, чтобы повысить конверсию?
Чтобы иметь приложение, которое откладывает значительное количество таких решений до времени выполнения, вы не можете бросать флаги функций в свое приложение в режиме ad-hoc, иначе у вас возникнут технические долги. Сегодня вам нужна всеобъемлющая стратегия управления флагами функций, которая включает в себя несколько различных компонентов.
- Точки переключения используются для переключения поведения для новых функций.
- Несколько точек переключения объединяются в маршрутизатор. Маршрутизатор-переключатель определяет состояние функции.
- Контекст переключения предоставляет маршрутизатору переключения необходимую контекстную информацию (например, конкретного пользователя).
- Конфигурация Toggle предоставляет информацию о состоянии маршрутизатора.
Итак, в конце концов, что такое флаги функций?
Что ж, они являются важной частью более широкой стратегии для приложения, которое адаптируется как к техническим, так и к рыночным потребностям.
Флаг функции (также известный как переключение функций или переключение функций) - это переключатель, позволяющий включать или отключать потенциально дорогостоящую функцию по мере необходимости (например, когда сайт перегружен неожиданным трафиком). Это даст вам немного времени, пока вы не увеличите масштаб или пока шип нагрузки не уйдет.
В моей компании у нас было собственное решение для этого. Мы создали сервис, предоставляющий загружаемый конфиг (.json
) файл для каждого приложения. В этой конфигурации мы сохранили флаги для функций. На основе этой конфигурации приложение может показать или скрыть текущую функцию.
(Например, показать или скрыть пункт меню на боковой панели).
Мы также создали внутреннюю страницу администратора, где мы можем настроить флаги функций. Некоторое время это работало довольно хорошо, но после этого мы хотели бы сделать таргетинг на пользователей и A/B-тестирование. Разрабатывать самостоятельно. Казалось, слишком много усилий, поэтому мы выбрали стороннее решение. Как уже упоминалось здесь, есть много решений для этого.
Мы выбрали ConfigCat, потому что он поддерживает настроенные целевые группы и процентное развертывание сразу. Вы можете проверить поддерживаемые sdks с открытым исходным кодом на github.
Флаги функций используются для нескольких целей. Общая идея состоит в том, чтобы делегировать контроль над тем, какой пользователь видит какую функцию, какой-либо удаленной панели управления или бэк-офису.
После того, как функция помечена в коде, теперь вы можете использовать несколько методов, чтобы определить, какой пользователь видит ее в вашем приложении: 1. Вкл / Выкл - показать функцию всем или ни одному из ваших пользователей. 2. Постепенный выпуск - покажите эту функцию только проценту ваших пользователей, а затем постепенно покажите ее всем пользователям. 3. Таргетинг - показать функцию конкретным пользователям на основе свойств или характеристик этого пользователя.
Инструменты, которые помогают управлять флагами функций (логические значения) и конфигурациями функций (строки, числа и т. Д.), Обычно называются платформами управления функциями. Существует отличная служба для управления функциями, которая называется https://configz.io/.
Флаги функций (или переключатели функций) позволяют удаленно включать функции в приложении без необходимости перестраивать / повторно развертывать приложение. Это позволяет вам развертывать код в рабочей среде, но не выпускать эту функцию, пока вы не будете готовы. Вы можете настраивать таргетинг на конкретных пользователей, поэтому вы можете включить новую функцию для бета-тестирования пользователей.
В нашей компании мы ранее использовали LaunchDarkly и другие предложения от https://featureflags.io/. Мы также попытались использовать удаленную конфигурацию Firebase, чтобы попытаться сделать эту работу, однако обнаружили, что она не подходит для этой цели.
В итоге мы разработали нашу собственную версию " Bullet Train", которую мы открыли. Он сочетает в себе функции флагов / переключателей и удаленной настройки.
Насколько я понимаю, флаги функций помогают вам управлять функциональностью, решая, какие пользователи получают определенные функции.
Например, допустим, вы хотите, чтобы ваши бета-пользователи увидели новую функцию. Вы бы "включили" эту функцию для пользователей бета-версии, а остальные пользователи не увидят ее.
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 - похоже, работает хорошо. Вы также можете проверить этот сайт для переключения функций и библиотек флагов функций.
С точки зрения кодирования флаг функции может быть таким же простым, как if
оператор, который обертывает новый фрагмент кода, который вы пишете. Когдаif
оператор оценивается как истина (флаг функции включен), тогда новый код будет выполнен.
В реальном примере доставки программного обеспечения if
Оператор, описанный выше, будет оцениваться по-разному в зависимости от среды, в которой работает программное обеспечение. Например, если приложение выполняется на вашем сервере QA, флаг функции вернет true, и новая функция будет видна. Если он выполняется на вашем производственном сервере, флаг функции вернет false, и функция будет скрыта.
Исходя из моего личного опыта в течение моей карьеры, я использовал флаги функций следующим образом:
Отделение развертывания кода от предоставления функций клиентам. Это было мое первое первоначальное использование флагов функций в процессе разработки. Мы использовали его, чтобы устранить зависимость между нашей маркетинговой и продуктовой командой и командой инженеров, которая занималась разработкой и выпусками. Флаги функций позволили нам развернуть наш код за несколько недель до запуска, тогда как раньше мы развертывали код за ночь до выпуска!
Тестирование в производстве. До того, как мы использовали флаги функций при выпуске нашего кода, это было событие "все или ничего": либо все наши клиенты получили эту функцию, либо ни один из них не получил ее. Мы использовали флаги функций, чтобы позволить нам внедрять новую функцию для небольшого процента пользователей за раз. Это позволило нам собрать ценные отзывы и данные о новой функции, не рискуя какими-либо потенциальными проблемами для всей клиентской базы.
Включение / отключение функции для каждой среды в жизненном цикле разработки. Мы широко использовали это при разработке, чтобы обеспечить более плавный процесс развертывания - у нас есть конвейер CI/CD, в котором использование флагов функций жизненно важно.
Создание аварийного выключателя. Мы обернули некоторые функции нашего приложения флагом функции, который позволяет нам "убить" эту функцию в случае любых проблем, которые у нас возникают с приложением в данный момент. Например, если мы оказываемся под большой нагрузкой, мы можем отключить некоторые несущественные функции веб-сайта, чтобы решить эту проблему.
Вы можете узнать больше о флагах функций здесь.
Вы можете добавлять в код флаги функций разными способами.
- Вы можете создать свою собственную или использовать стороннюю библиотеку флагов функций и добавить данные о своих флагах в файл конфигурации, который можно включить в ваш пакет развертывания.
- Вы можете создать свою собственную или использовать стороннюю библиотеку флагов функций и добавить данные о своих флагах в файл конфигурации, который можно загрузить во время выполнения.
- Вы можете использовать облачную службу управления флагами функций, чтобы управлять всеми необходимыми флагами функций за вас.
Поначалу создание собственной библиотеки может показаться хорошей идеей, и обычно все начинается именно так. Однако вскоре вы можете столкнуться с проблемами, если захотите реализовать более сложные варианты использования флагов функций, такие как развертывание для определенного процента пользователей или нацеливание на определенные группы пользователей. Другая проблема с созданием собственной реализации флага функции заключается в том, что если вы используете несколько языков, вам нужно будет реализовать свой код несколько раз.
Лучший и самый простой способ использовать флаги функций - использовать онлайн-службу управления флагами функций, такую как 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...
}
Если вы работаете в группе разработчиков и не используете флаги функций, и у вас возникают проблемы с развертыванием и управлением кодом внутри группы. Использование флагов функций может быть отличным способом решения этих проблем. Также есть приятный побочный эффект - флаги функций, ускоряющие скорость разработки вашей команды.
Мартин Фаулер дает очень углубленной рецензию полнометражных флагов здесь, которые я рекомендую вам прочитать.
В моей компании мы используем флаги функций для каждой новой функции, которую мы представляем в нашем приложении SaaS. Помимо преимуществ для производительности, он также позволяет нам постепенно внедрять новые функции - сначала вводить новые функции для опытных пользователей, получать от них отзывы и импровизировать, прежде чем мы сможем развернуть их для всех пользователей.
Это также позволяет нам настраивать предложение для отдельных пользователей - опытные пользователи хотят все функции; простые пользователи могут просто захотеть базовых вещей и могут быть смущены всеми мощными сложными функциями. Это также позволяет нашему отделу продаж продавать.
И, конечно, как уже отмечали другие, если мы обнаружим, что функция вызывает снижение производительности, мы можем просто отключить эту функцию (либо для всех клиентов, либо для одного клиента, вызывающего проблему).
Флаги функций в основном дают вам возможность включать и выключать функцию без внесения каких-либо изменений в код или выпуска новой версии. Это важное решение, особенно для разработчиков мобильных приложений, так как они не контролируют пользователей, чтобы обновить свое приложение до новой версии.
Есть несколько компаний, предоставляющих этот сервис для разработчиков мобильных приложений.