Какие они?

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

Проблема

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

Войдите в мир флагов функций

С помощью флагов функций наша команда смогла внедрить небольшие изменения в код / ​​неполные функции в рабочую среду. Это отделило развертывание нашей функции от развертывания кода, что позволило нам постоянно интегрировать наш код с производственной версией и получать раннюю обратную связь.

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

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

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

Удачного кодирования и оставайтесь в безопасности!