Как реализовать ограниченное развертывание функций (независимо от языка) для ваших пользователей?

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

Пользователи могут быть, например, основаны исключительно на проценте от вашей общей базы пользователей (10%). Развертывание должно быть настраиваемым (конфигурируемым) и поддерживать любое количество функций. Также было бы полезно связать развертывания с определенными ролями или привилегиями пользователей (ACL).

Итак, по сути, что такое архитектура, которая будет достаточно хорошо масштабироваться?

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

Ссылки на любые примеры или руководства приветствуются.


person Corey Ballou    schedule 10.01.2011    source источник
comment
Я вспоминаю сообщение в блоге некоторое время назад о стратегии Twitter. Если кто-то может выкопать это и опубликовать комментарий, который также будет полезен.   -  person Corey Ballou    schedule 12.01.2011
comment
Недавно я нашел библиотеку github, rollout, которая реализует большую часть этой функциональности. Он позволяет настроить таргетинг на всех пользователей, конкретных пользователей или процент пользователей. github.com/jamesgolick/rollout   -  person Corey Ballou    schedule 08.04.2013
comment
Хорошее обсуждение этого вопроса здесь stackoverflow.com/ вопросы/7707383/что такое флаг функции/   -  person Matt Kocaj    schedule 27.02.2017


Ответы (4)


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

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

После завершения развертывания ветка объединяется, и все видят новую функцию.

Таким образом, вам не нужно беспокоиться о том, что кодовая база, которую видят пользователи публичной бета-версии, отличается (каким-то образом, что может что-то сломать) от кодовой базы окончательного релиза.

person Jacob Mattison    schedule 10.01.2011
comment
Спасибо за быстрый ответ, Яков. Некоторые быстрые вещи, которые возникают, когда я думаю об условных проверках при входе в систему, заключаются в обеспечении того, чтобы сеансы были глобальными на всех машинах для правильной обработки перенаправлений на один и тот же разветвленный клон функции. - person Corey Ballou; 10.01.2011
comment
очень хорошее решение, но мне интересно, как следует обрабатывать случаи, когда вместе с кодовой базой изменяется схема базы данных. На мгновение я подумал о раздельной миграции схемы и данных, но когда дело доходит до выпуска определенной функции для всех пользователей, слияние данных может оказаться очень сложной задачей. Вы когда-нибудь сталкивались с такой ситуацией? - person mcveat; 10.01.2011
comment
@mcveat: да, это потенциальная проблема. В общем, это проблема с ветвлением приложений, конечно. Некоторые подходы к базам данных, такие как миграция Rails, позволяют вам сохранить спецификацию схемы с конкретной кодовой базой, но это все равно не поможет вам слить фактические данные. Я думаю, что я бы создал новую БД с новой схемой и настроил путь миграции данных, который перемещал бы пользователей из старой схемы в новую. Пользователи бета-версии сразу же перемещаются, и в конечном итоге перемещаются все, и новая схема становится единственной схемой. - person Jacob Mattison; 10.01.2011
comment
@cballou: если перенаправление происходит только при входе в систему, я думаю, что разумно начинать новый сеанс всякий раз, когда кто-то входит в систему. - person Jacob Mattison; 10.01.2011

На моей последней работе мы добились этого с помощью балансировщика нагрузки и файла cookie текущей версии.

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

Однако эта установка не поддерживает обратно несовместимые изменения базы данных. Практически нет способа сделать это, когда вы можете иметь часть своих пользователей в одной схеме БД, а часть в другой, и иметь возможность выполнять записи в обе, а затем каким-то образом объединять эти записи вместе после того, как вы решили, что новая версия в порядке. . Я имею в виду, что это возможно, но это действительно зависит от того, какие именно изменения схемы и как они влияют на ваше приложение, поэтому вы не можете сделать это надежным, независимым способом при развертывании. Для нас мы просто старались не делать обратно несовместимых изменений схемы. Если бы нам действительно это было нужно, мы бы попытались отложить деструктивную часть (удаление столбца или таблицы) до более поздней версии, где мы могли бы перенести схему и запустить обе версии без каких-либо негативных последствий для текущих пользователей.

person derek73    schedule 22.01.2011

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

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

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

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

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

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

Я надеюсь, что это будет полезно для вас... удачи с вашим товарищем по тестированию.

person Ryan    schedule 06.07.2011

Оптимизатор веб-сайтов Google кажется именно тем, что вы ищете.

person Steve    schedule 05.07.2011
comment
Нет, не совсем так, оптимизатор веб-сайтов Google больше похож на A/B-тестирование, но @ cballou ищет способ предоставить определенной группе пользователей новую функцию, например, новую систему комментариев или загрузчик, а не просто изменение макета. - person krichard; 06.07.2011