Здесь High Scalability упоминает флаги функций:
5 вещей, отравляющих масштабируемость : «5. Отсутствие флагов функций»
Что такое флаги функций?
Здесь High Scalability упоминает флаги функций:
5 вещей, отравляющих масштабируемость : «5. Отсутствие флагов функций»
Что такое флаги функций?
Ответы:
«Флаг функции» (или Переключатель функций ) - это возможность легко включать и отключать функции (подразделы) вашего приложения:
Я предполагаю, что в приведенном примере было удобно иметь элемент управления для некоторого уменьшения набора функций, если вам нужно, скажем, уменьшить количество запросов к базе данных, если нагрузка слишком высока.
Тем не менее, есть множество других причин, по которым вы хотели бы использовать это, одна из основных - включение непрерывной доставки : отправка вещей в производство / живую, но с отключенной / переключенной функцией до ее завершения. Мы часто используем так называемые файлы cookie разработчика, чтобы показать незавершенные функции только команде разработчиков. Таким образом, мы можем протестировать частично выполненную работу в продакшене (ах, а есть ли лучшая интеграция?) В нескольких выпусках / развертываниях, прежде чем мы «отключим» (завершим) ее, и она станет видимой для публики.
Вот простой пакет, который поможет вам сделать это в среде ASP.NET MVC: https://github.com/cottsak/DevCookie (полное раскрытие: я автор)
У Фаулера также есть гораздо более длинная статья, чем та, что указана выше, с гораздо большим количеством деталей .
В этом сообщении (также на сайте Фаулера) объясняются различные типы стратегий переключения . DevCookie поддерживает стратегию mainline / trunk и в статье называется « Release Toggle ».
Ответ Адиля подчеркивает, что существует множество терминов и причин, по которым вам может понадобиться некоторая часть этой инфраструктуры. Имейте в виду, что вам могут понадобиться только некоторые из этих вещей. Например, мне может понадобиться только включить простой и гибкий рабочий процесс развертывания / доставки, поэтому простой инфраструктуры будет достаточно. Если вы затем решите перейти к полному экспериментированию #leanstartup с A / B, когортным тестированием и такими вещами, как контролируемое развертывание, вам следует рассмотреть инструмент аналитики (например, Heap ), который упрощает эти методологии разработки на основе данных, как отдельное решение. . Инфраструктура переключения, которая выполняет все вышеперечисленное, приведет к раздуванию и ненужной сложности.
Если вы зашли так далеко, то, возможно, вам захочется ознакомиться с некоторыми из моих других мыслей по поводу основной разработки, переключения функций и других глупых идей, таких как ТЕСТ, QA, SIT, STAND, CROUCH .
Флаг функции - это метод отключения некоторых функций вашего приложения с помощью конфигурации без развертывания нового кода.
Флаги функций играют ключевую роль в схеме CI, где функции постоянно развертываются, но не обязательно «выпускаются» в производство.
Больше информации здесь:
-- РЕДАКТИРОВАТЬ:
Флаги функций, переключатели функций, эксперименты и контролируемое развертывание - это синонимы простой, но действенной идеи: развертывание кода отдельно от развертывания функций. Проще говоря, это возможность продвигать коммиты вашей функции в производство, выбирая, кто из ваших клиентов - если вообще кто-либо - сможет увидеть эту функцию.
Частично их популяризировал Gatekeeper Facebook . LiX от LinkedIn - еще один хороший пример.
Принятие этой простой идеи закладывает основу для многих передовых практик, в том числе:
Непрерывное развертывание / доставка - запуск нескольких кодов в рабочую среду за день.
Trunk / Mainline Development - ветки функций должны создаваться только для запросов на вытягивание, а не для долговременной разработки функций.
Больше никаких поездов по выпуску, чтобы увязнуть.
QA / Perf Testing in Production - настоящее тестирование QA и производительности проводится в производственной инфраструктуре с производственным трафиком. Не тратьте время на создание обширных лабораторий производительности и промежуточных сред.
Экспериментируйте - узнайте, как новая функция перемещает стрелку ваших KPI.
Избегайте исправлений или откатов кода при возникновении проблем - исправления и откаты кода вызывают стресс, занимают много времени и приводят к большему количеству проблем, чем необходимо. Вместо этого выключите эту функцию или уменьшите ее.
Другие упомянули библиотеки с открытым исходным кодом. Хорошим примером полного решения, такого как Gatekeeper и LiX, является Split . Я работаю в Сплите.
Здесь есть много отличных ответов, основанных на важном базовом определении, популяризированном в сообщении Мартина Фаулера :
Это фрагменты кода, которые «[позволяют] командам изменять поведение системы без изменения кода».
Итак, мы исторически думали о них как о псевдокоде:
if(app_settings["beta-mode"] == "true")
showAwesomeNewGui();
else
sameOldSnoozeFeset();
Это совершенно точный способ думать об этом, и Мэтт и Адил прекрасно дополняют его, предлагая множество тактических вариантов использования флага функции.
Но я хотел бы предложить пересмотренное определение, которое отражает, как реальность развивалась за шесть лет и изменилась с тех пор, как dotnetdev задал исходный вопрос. Я работаю на Rollout.io , платформу с флажками функций, так что у меня было место в первом ряду для этой эволюции.
Проще говоря, флаги функций - это уже не просто способ включать и отключать некоторые функции в вашем приложении. Это все равно, что ответить «что такое строка счета-фактуры», сказав «это описание и сумма валюты». Верно, но это не касается самого счета-фактуры в более широком смысле.
Флаги функций - это тактические элементы всеобъемлющего стратегического решения в современном программном обеспечении. Они являются средством, с помощью которого вы откладываете важную логику принятия решений в своем коде до времени выполнения, когда у вас будет больше информации. И, что, возможно, наиболее важно, они больше не происходят просто изолированно, с единственной проверкой, чтобы узнать, больше ли номер версии 2.7 или нет; организации, которые их используют, обычно включают их как часть комплексного общесистемного подхода к продукту.
Как уже упоминалось, Facebook и LinkedIn первыми сделали это, но в 2018 году это сделали многие организации. Они откладывают вопросы логики принятия решений для среды выполнения как часть стратегии разработки, операционной стратегии (или стратегии DevOps, если хотите) и стратегии продукта. Вот примеры таких вопросов.
Чтобы иметь приложение, которое откладывает значительное количество таких решений до времени выполнения, вы не можете добавлять в приложение флаги функций специальным образом, иначе вы погребете себя в техническом долгу. В наши дни вам нужна комплексная стратегия управления флагами функций, которая включает в себя несколько различных компонентов.
Итак, в конце концов, что такое флаги функций?
Что ж, они являются важной частью более широкой стратегии создания приложения, которое можно адаптировать как к техническим, так и к рыночным потребностям.
Флаг функции (также известный как переключение функций или переключение функций ) - это переключатель, позволяющий включать или отключать потенциально дорогостоящую функцию по мере необходимости (например, когда на сайт забивается неожиданный трафик). Это даст вам немного времени, пока вы не увеличите масштаб или пока не исчезнет скачок нагрузки.
В моей компании для этого было собственное решение. Мы создали сервис, предоставляющий загружаемый файл config ( .json
) для каждого приложения. В этой конфигурации мы сохранили флаги для функций. На основе этой конфигурации приложение может отображать или скрывать текущую функцию. (Например, показать или скрыть пункт меню на боковой панели).
Мы также создали внутреннюю страницу администратора, где мы можем настроить флаги функций. Некоторое время это работало неплохо, но после этого мы хотели бы провести таргетинг на пользователей и A / B-тестирование. Самостоятельная разработка Казалось слишком трудоемким, поэтому мы выбрали стороннее решение. Как уже упоминалось здесь, для этого есть много решений.
Мы выбрали ConfigCat, потому что он поддерживает сразу индивидуальные целевые группы и процентное развертывание. Вы можете проверить поддерживаемые SDK с открытым исходным кодом на github .
Флаги функций (или переключатели функций) позволяют удаленно включать функции в приложении без необходимости повторной сборки / повторного развертывания приложения. Это позволяет вам развернуть код в производственной среде, но не выпускать функцию, пока вы не будете готовы. Вы можете настроить таргетинг на конкретных пользователей, чтобы вы могли включить новую функцию для тестирования бета-пользователями.
В нашей компании мы ранее использовали LaunchDarkly и другие предложения от FeatureFlags.io . Мы также пытались использовать удаленную конфигурацию Firebase, чтобы попытаться выполнить эту работу, но мы обнаружили, что она не совсем подходит для этой цели.
В итоге мы разработали нашу собственную версию под названием Bullet Train , исходный код которой был открыт. Он сочетает в себе как флаги / переключатели функций, так и удаленную конфигурацию.
Флаги функций используются для нескольких целей. Общая идея состоит в том, чтобы делегировать контроль над тем, какой пользователь видит какую функцию, какой-либо удаленной панели управления или бэк-офису.
После того, как функция отмечена в коде, вы можете использовать несколько методов, чтобы определить, какой пользователь видит ее в вашем приложении: 1. Вкл. / Выкл. - показать функцию всем или никому из ваших пользователей. 2. Постепенный выпуск - покажите функцию только проценту пользователей, а затем постепенно покажите ее всем пользователям. 3. Таргетинг - показать функцию конкретным пользователям на основе свойств или характеристик этого пользователя.
Инструменты, которые помогают контролировать флаги функций (логические значения) и конфигурации функций (строки, числа и т. Д.), Обычно называются платформами управления функциями. Существует отличный сервис для управления функциями под названием Configz.io.
С точки зрения кодирования флаг функции может быть таким же простым, как if
оператор, который обертывает новый фрагмент кода, который вы пишете. Когда if
выражение оценивается как истинное (флаг функции включен), будет выполнен новый код.
В реальном примере доставки программного обеспечения if
описанный выше оператор будет оцениваться по-разному в зависимости от среды, в которой работает программное обеспечение. Например, если приложение выполняется на вашем сервере контроля качества, флаг функции вернет 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...
}
Если вы работаете в группе разработчиков и не используете флаги функций, и у вас возникают проблемы с развертыванием и управлением кодом внутри группы. Использование флагов функций может быть отличным способом решения этих проблем. Также есть приятный побочный эффект - флаги функций, ускоряющие скорость разработки вашей команды.
Мартин Фаулер дает очень углубленной рецензию полнометражных флагов здесь , которые я рекомендую вам прочитать.
Насколько я понимаю, флаги функций помогают вам ограничивать функциональность, решая, какие пользователи получают определенные функции.
Например, предположим, что вы хотите, чтобы только ваши пользователи бета-версии видели новую функцию. Вы бы «включили» эту функцию для бета-пользователей, и остальные пользователи ее не увидят.
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 - похоже, работает хорошо. Вы также можете посетить этот сайт, чтобы узнать о переключателях функций и библиотеках флагов функций .
Флаги функций в основном дают вам возможность включать и выключать функцию без внесения каких-либо изменений в код или выпуска новой версии. Это важное решение, особенно для разработчиков мобильных приложений, поскольку они не могут контролировать, как пользователи обновляют свое приложение до новой версии.
Есть несколько компаний, предоставляющих эту услугу для разработчиков мобильных приложений.
В моей компании мы используем флаги функций для каждой новой функции, которую мы представляем в нашем приложении SaaS. Помимо преимуществ для производительности, это также позволяет нам постепенно внедрять новые функции - сначала вводить новые функции опытным пользователям, получать от них отзывы и импровизировать, прежде чем мы сможем внедрить их для всех пользователей.
Это также позволяет нам настраивать предложения для отдельных пользователей - опытным пользователям нужны все функции; простые пользователи могут хотеть только базовые вещи и могут быть сбиты с толку всеми мощными комплексными функциями. Это также позволяет нашему отделу продаж делать дополнительные продажи.
И, конечно же, как указывали другие, если мы обнаружим, что функция вызывает снижение производительности, мы можем просто отключить эту функцию (либо для всех клиентов, либо для одного клиента, вызывающего проблему).