Какие они?
Флаги функций или переключатели функций - полезный способ изменения или добавления новых функций в систему, не затрагивая реальных пользователей. Вы можете добавить новые функции или изменить поведение существующих функций за флагом функции, а затем попросить своих тестировщиков протестировать их или провести A / B-тестирование с некоторым набором реальных пользователей. Позже, если это будет сочтено успешным, вы можете удалить флаг функции и предоставить функции всем пользователям.
Проблема
- Нам нужен был лучший способ непрерывной доставки и развертывания наших функций в производственной среде.
- Нам также нужен был способ не блокировать функции, над которыми параллельно работают, все еще тестируются или завершаются тестированием нашими QA.
- Нам также нужен был способ предоставить функцию некоторой группе пользователей, чтобы получить обратную связь, чтобы решить, насколько удобно ее использовать.
Войдите в мир флагов функций
С помощью флагов функций наша команда смогла внедрить небольшие изменения в код / неполные функции в рабочую среду. Это отделило развертывание нашей функции от развертывания кода, что позволило нам постоянно интегрировать наш код с производственной версией и получать раннюю обратную связь.
Когда функции помещались под флаг функции, это не блокировало запуск других функций, тестирование которых QA завершило.
Мы смогли протестировать наши функции в производственной среде, поскольку иногда невозможно полностью смоделировать производственную среду, что минимизировало риск развертывания функции. Теперь мы можем легко откатить функцию, отключив при необходимости флаг функции.
С флагами функций нужно быть очень осторожными, так как они могут вызвать ветвление в вашем коде. Будьте осторожны при сохранении чистоты кода, поскольку флаги функций являются временными и их должно быть легко удалить при необходимости.
Для установки и использования флагов функций вместо использования каких-либо сторонних библиотек мы просто проверяем заголовки запроса для нашего настраиваемого заголовка X-Incubating-Features,, который сообщает нам установите флажок функции ВКЛ или ВЫКЛ. Вы можете использовать любой из модификаторов заголовка HTTP-запроса, чтобы установить этот флаг для веб-приложений. Я предпочитаю использовать Requestly, но решать вам.
Давайте рассмотрим несколько примеров
Сценарий 1:
Предположим, вы проводите серьезный рефакторинг, чтобы сократить время отклика в одном из фрагментов кода, который вычисляет текущее состояние пользователя на основе данных, полученных из различных внешних систем.
Поскольку этот рефакторинг потребует времени, вместо того, чтобы создавать долгоживущую ветвь и затем пытаться объединить свой код с мастером, вы можете просто использовать флаги функций, чтобы постоянно отправлять свои изменения в мастер. Это позволит другим работать с тем же фрагментом кода, если потребуется.
function calculateTheCurrentState() { /* code to fetch the data from external systems and then calculate the status */ }
Это функция, которая выполняет работу по выборке данных из разных источников, а затем определяет их текущее состояние.
с введением флагов функций это будет выглядеть примерно так:
В строке номер 5 в приведенном выше коде мы должны определить, установлен ли флаг функции в заголовках или нет, и превратили строку номер 7 в точку переключения. Если кто-то хочет использовать новый алгоритм, ему просто нужно передать флаг X-Incubating-Features в заголовках запроса.
Как вы можете заметить, этот код можно отправить и развернуть в производственной среде, не затрагивая существующую функциональность, что позволяет разработчикам получать непрерывную и своевременную обратную связь.
при написании интеграционного теста, который я рассмотрел в предыдущих сообщениях, вы должны установить этот заголовок перед вызовом маршрута приложения, чтобы оно использовало новый алгоритм.
Как вы можете видеть в приведенном выше коде в строке 19, мы просто устанавливаем наш собственный заголовок запроса, чтобы указать приложению использовать все функции, которые находятся в разделе «Флаги функций».
Сценарий 2:
Подумайте, в вашем пользовательском интерфейсе вам нужна функция, которая будет фильтровать список пользователей по идентификатору электронной почты. Теперь для этого вам не требуется какой-либо FF в логике бэкэнда, поскольку бэкэнд-код зависит от того, используется ли фильтр в пользовательском интерфейсе или нет.
В таких случаях вы можете использовать FF, чтобы решить, хотите ли вы отображать эту функцию в пользовательском интерфейсе или нет. вы можете просто добавить FF в свой файл движка шаблонов пользовательского интерфейса.
if (isIncubatingFeature) input(type="text", name="emailFilter", placeholder="enter email")
В этом примере используется PUG, механизм рендеринга на стороне сервера, и isIncubatingFeature снова определяется тем фактом, что флаг X-Incubating-Features передается в заголовки запроса или нет.
Таким образом, теперь вы можете переключать любую функцию / функциональность в своем приложении, даже в производственной среде, чтобы увидеть, работает ли она должным образом, тем самым минимизируя риск выпуска новых функций.
Я бы написал серию статей о методах, которым мы следовали для решения проблем разработки программного обеспечения. Если вы хотите получить уведомление, когда я напишу новую статью. Пожалуйста, введите здесь свой адрес электронной почты
Удачного кодирования и оставайтесь в безопасности!