Концепция слоев#
При одновременном проведении нескольких экспериментов существует риск их взаимовлияния на метрики в отчёте и, главное, на пользовательский опыт.
Система слоёв позволяет одновременное проведение нескольких конфликтующих экспериментов, минимизируя риск негативного влияния на пользовательский опыт.
Слои и размещённые на них эксперименты можно посмотреть на TODO
Пример конфликтующих экспериментов
Приведём классический пример:
- эксперимент
А
: проверяется добавление синего фона для определённой кнопки в интерфейсе - эксперимент
В
: тестируется изменение цвета текста на синий для той же кнопки.
Пользователь одновременно попавший в оба эксперимента столкнется с синей кнопкой, на которой не виден синий текст.
Эксперименты затрагивающие одинаковые части системы, могут быть несовместимы или, другими словами, иметь конфликты.
Описание системы#
Слой – инструмент для проведения А/В тестирования, представляющий часть функциональности системы, в которой проводятся тесты. Слои позволяют сгруппировать конфликтующие эксперименты и провести их одновременно без риска создания пересечений по трафику. Технически слой является представлением пользовательского трафика приходящегося на определённую часть системы.
Например, слой cart
может обозначать функционал доступный пользователю при работе
с корзиной товаров.
При проведении экспериментов такой слой представляет собой трафик, связанный с действиями
пользователя в "корзине товаров".
Основной задачей слоя является формирование сжатого представления пользовательского трафика пригодного для составления правил по совместному использованию трафика в экспериментах.
Каждый слой состоит из набора слотов, представляющих собой равные и неделимые доли трафика. Количество слотов является главным параметром слоя. Обычно слой состоит из 200 слотов. Минимальная доля трафика на таком слое равна 0.5%.
В качестве связующего компонента между размещаемыми объектами и слоями используются размещения. Размещения описывают набор слотов, закреплённых за размещённым объектом, а также содержат настройки, используемые для определения конфликтов.
Для исключения нежелательных конфликтов каждый эксперимент должен быть привязан к слою.
Устройство системы
В качестве внутреннего представления трафика в системе используется набор слотов. Слот является неделимой единицей и представляет долю трафика обратно пропорциональную количеству слотов на слое.
Каждый слой состоит из набора слотов, количество определяется при создании. Слоты на слое имеют равные доли и вместе составляют полные 100% трафика. Количество слотов определяет гранулярность трафика на слое. Например, слой из 100 слотов оперирует долями трафика по 1%, и эксперименты на таком слое могут задействовать количество трафика кратное 1%.
Каждая единица трафика проецируется случайным и воспроизводимым образом на один из слотов слоя по следующему правилу:
slotNum = hash(str(trafficUnitId) + layerSalt) % layerSlotsCount
В качестве trafficUnitId
может выступать любой идентификатор, на основе которого проводится
эксперимент.
Случайность и воспроизводимость проецирования обеспечивается механизмом хэширования, а соль
слоя layerSalt
позволяет дополнительно перемешать трафик на слое.
Уникальная для каждого слоя соль обеспечивает разные результаты проецирования на разных слоях,
а также позволяет изменять проецирование (перемешивать трафик) на слое с течением времени
(например, по завершению всех экспериментов на слое для избавления от т.н. "эффекта памяти").
Дополнительным параметром слоя является "вместимость" слотов слоя. Этот параметр может использоваться для установления верхней планки по количеству размещений одновременно задействующих слот. Может использоваться для того, чтобы сделать использование слотов слоя более равномерным, а также ограничить сверху вероятность конфликтов между размещениями (чем меньше размещений могут одновременно использовать слот, тем ниже шанс возникновения конфликтов между ними). На текущий момент этот параметр не используется, и, вероятно, требует доработки, потому как совершенно не учитывает границы действия размещений.
Размещения определяют связь размещаемого на слое объекта (например, эксперимента) и набора слотов. Помимо этого они содержат информацию о наличии и характере конфликтов с другими размещениями.
Участие в эксперименте размещённом на слое определяется попаданием проекции единицы трафика в определённый набор слотов.
Как слои помогают решить проблему одновременного проведения конфликтующих экспериментов?#
Возьмем два эксперимента из примера: A
и B
.
Известно, что они проводятся на одной кнопке и считаются конфликтующими.
Пользователь из примера не должен иметь возможность попасть в эксперимент A
с добавлением
синего фона на кнопку и, одновременно, в эксперимент B
со сменой цвета текста на синий.
В то же время пользователь может участвовать в одном из экспериментов или вовсе
не участвовать ни в одном из них.
Главный принцип для решения данной проблемы заключается в том, что конфликтующие эксперименты не могут одновременно использовать общий трафик.
Для осуществления этого принципа применяется проекция трафика на слоты, а также размещения, свойства которых описывают отношения между размещениями и подход к совместному использованию слотов. Основное правило в системе управления конфликтами звучит так: размещения, конфликтующие между собой, не могут одновременно занимать одни и те же слоты на слое.
Для применения этого правила на практике, необходимо разместить оба эксперимента на одном слое,
например, слое button
, и затем указать, что эти размещения конфликтуют между собой.
Тогда при запуске экспериментов система будет автоматически проверять, что правило не
нарушено и не позволит запустить эксперимент, если после запуска оно окажется нарушенным.
Размещения и настройки конфликтов#
Размещения не только хранят связь между размещённым объектом и слотами слоя, но метаинформацию об объекте, а также настройки для управления системой.
Среди метаинформации об объекте в размещении содержится:
- тип размещённого объекта
- границы действия (тип участника, набор платформ и соответствующих минимальных версий)
Границы действия размещённого объекта используются для определения возможности конфликтов. Для объектов с непересекающимися границами действия считается, что возникновение конфликтов невозможно.
Таким образом, размещения играют роль основного инструмента для настройки логики определения конфликтов в системе. Параметры размещения позволяют управлять проверкой наличия конфликтов и поведением при изменении состава слотов / ситуации на слое.
Настройки размещений
Механика выбора слотов#
На текущий момент реализовано две механики выбора слотов для размещений: автоматическая и ручная.
Автоматический выбор слотов даёт возможность указать необходимую долю трафика на слое, и оставить выбор слотов на усмотрение системы. Такая механика выбора позволяет системе автоматически скорректировать выбор слотов перед запуском эксперимента, если изначально выбранные слоты окажутся недоступными по каким-то причинам.
Ручной выбор слотов может потребоваться в отдельных случаях, когда необходимо зафиксировать набор слотов для использования размещением. Например, такая механика нужна для проведения рекламных экспериментов, в которых номер слота на слое имеет дополнительное продуктовое значение. Слоты выбранные вручную система не может корректировать автоматически, поэтому запуск эксперимента с большей вероятностью может быть запрещён из-за недоступности выбранных слотов.
В большинстве случаев рекомендуется использовать автоматический выбор слотов.
Подход к совместному использованию слотов#
Для использования представлены два подхода: "допускающий" и "запрещающий". Основное отличие между подходами заключается в логике определения конфликтов между размещениями.
Допускающий подход реализует логику: "прочие размещения слоя не считаются конфликтными до тех пор, пока пользователь не отметит их конфликтующими". Этот подход используется в большинстве случаев на платформе.
Запрещающий подход реализует другую логику: "прочие размещения слоя считаются конфликтными до тех пор, пока пользователь не отметит отсутствие конфликтов". Такой подход может потребоваться для экспериментов изменяющих существенную часть функционала, т.к. для них вероятность наличия конфликтов с другими экспериментами на слое выше. Также такой подход может быть полезен для проведения рекламных экспериментов, для которых запрещается одновременное использование слота на слое несколькими экспериментами.
Рекомендуется использовать допускающий подход во всех случаях, кроме тех, где требуется особо тщательный контроль за отсутствием конфликтов.
Размещаемый объект#
Реализовано два вида размещаемых объектов: эксперименты и варианты экспериментов.
Размещение вариантов эксперимента допускается в особых случаях, в остальных следует использовать размещение экспериментов.
Особым случаем являются, например, рекламные эксперименты, в которых необходимо зафиксировать номера слотов на слое за вариантами эксперимента ввиду наличия продуктового смысла закреплённого за номером слота.
Статусы размещений#
Каждое размещение может находиться в одном из трех статусов:
- "Запланировано" – размещение на слое создано, но не используется для разметки трафика. Наличие конфликтов в этом статусе не проверяется, возможны любые изменения параметров.
- "Активно" – размещение в текущий момент используется для разметки трафика. Переход в этот статус происходит, например, при запуске эксперимента после проверки отсутствия конфликтов. В этом статусе у размещения можно менять долю трафика, и настройки конфликтов. Изменения будут применены только в том случае, если не будет создано новых конфликтов. Переход в статус "Активно" возможен только на активных слоях. Слои могут быть "заморожены" – запрещать активацию новых размещений.
- "В архиве" – размещение не используется для разметки трафика, проверки конфликтов отключены, изменения запрещены. Размещения в этом статусе хранятся в системе для истории и более не могут быть использованы. Переход в этот статус происходит при, например, остановке эксперимента.
Размещения сгруппированные по статусам отображаются в "карточке" слоя на странице слоёв. Для удобства восприятия из отображения исключены размещения в статусе "В архиве".
Где настраиваются параметры системы?#
Параметры слоёв задаются при создании/редактировании слоя. Желательно иметь достаточное, но не избыточное количество слоёв в системе, т.к. это позволяет избегать путаницы при выборе слоя для размещения, а также сокращает риск возникновения конфликтов между экспериментами на разных слоях.
Настройки размещений выведены в интерфейс работы с экспериментами и доступны по нажатию на кнопку "Настройки запуска" на странице эксперимента.
В настройках запуска эксперимента можно выбрать слой для размещения, задать необходимую долю трафика, а также отметить конфликты с другими экспериментами на слое. Конфликты можно отметить как для уже экспериментов, так и для тех, что только планируются.
Выбор слоя зависит от затрагиваемой экспериментом функциональности.
Доступный на слое трафик зависит от выбора конфликтов и, для удобства, отображается раздельно по платформам. После запуска доля трафика приходящаяся на указанные в эксперименте платформы будет одинаковой. Чтобы оценить максимальную доступную долю трафика для задействования можно ориентироваться на минимальный процент трафика по платформам в блоке "Свободное место".
Если эксперимент ещё не запущен, а необходимая доля трафика превышает максимально доступную, при запуске эксперимент попадёт в очередь и будет ожидать освобождения небходимого количества трафика.
Для запущенных экспериментов при редактировании настроек запуска можно увеличить долю трафика только до количества, которое не будет превышать максимально доступное.
Настройки запуска связаны с определённым слоем и смена слоя, при сохранении прочих параметров не имеет смысла. Поэтому при необходимости сменить слой, нужно сбросить текущие настройки запуска, а затем задать новые.
Редактирование "настроек запуска" остаётся доступным после запуска эксперимента. Таким образом, при необходимости, можно изменить долю трафика в запущенном эксперименте или отметить новые / отредактировать указанные конфликты.
Ограничения системы#
На текущий момент в системе слоёв существуют следующие ограничения:
- Не реализована возможность указания межслойных конфликтов. Такая возможность может потребоваться, если эксперимент затрагивает разные части функционала и необходимо обеспечить отсутствие конфликтов с экспериментами на разных слоях. Поскольку проекция трафика на слоты для разных слоёв будет отличаться ввиду разницы солей, реализация межслойных конфликтов приведёт к блокировке запуска экспериментов с других слоёв, указанных конфликтующими при запуске одного из них после запуска
- Нет возможности указать среди конфликтов эксперименты с разными границами влияния. Например, может возникнуть запрос на указание среди конфликтов экспериментов с разными типами участников