Ваша серверная часть - это простой файл YAML

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

На рынке доступно множество систем для управления вашими флагами, например LaunchDarkly или UNLEASH, которые имеют поддержку Golang, но этот вариант стоит дорого, и вам нужно где-то разместить сервер для управления вашими флагами.

С этого момента мне пришла в голову идея создать простую библиотеку с одним файлом в задней части. Этот файл можно хранить в разных местах (AWS S3, GitHub, где-нибудь в конечной точке HTTP и т. Д.). Это единственное, что вам нужно разместить - вся логика принятия решений находится внутри модуля Go.

Почему новое решение?

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

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

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

Поэтому я решил создать go-feature-flag, простую и легкую в реализации систему функциональных флагов, вообще без серверной части, за исключением общего файла конфигурации, который можно хранить где угодно (S3, GitHub, конечная точка HTTP и т. Д. .).

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



Как это работает?

Этот модуль Go работает очень просто. Он просто читает общий файл каждые x секунд и дает вам способ получить значение вашего флага того типа, который вы ожидаете.

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

Система правил, основанная на nikunjy/rules, позволяет вам определять сложные правила для применения флага только к подмножеству ваших пользователей.

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

Как это использовать

Основная цель go-feature-flag - быть очень простым, чтобы вам не нужно было много делать, чтобы его использовать.

  • Первое, что нужно сделать, это разместить где-нибудь свой конфигурационный файл (S3, GitHub и т. Д.).
  • Во время инициализации приложения запустите go-feature-flag с конфигурацией:
err := ffclient.Init(ffclient.Config{
    PollInterval: 3,
    Retriever: &ffClient.HTTPRetriever{
        URL:    "https://raw.githubusercontent.com/thomaspoignant/go-feature-flag/main/testdata/test.yaml",
    },
})
defer ffclient.Close()
  • Теперь, когда вы выполнили инициализацию go-feature-flag, вы можете увидеть значение флага для своих пользователей примерно так:
user := ffuser.NewUser("user-unique-key")
hasFlag, _ := ffclient.BoolVariation("test-flag", user, false)
if hasFlag {
    // flag "test-flag" is true for the user
} else {
    // flag "test-flag" is false for the user
}

Примечание. Ваш вариант вернет значение по умолчанию (последний параметр), если у вас есть ошибка (флаг отсутствует, неправильный тип и т. д.).

  • Это простой пример, но вы можете указать сколько угодно свойств для своего User, чтобы выполнять сложные запросы к вашему флагу.
user = ffuser.NewUserBuilder("user-unique-key").
 AddCustom("firstname", "John").
 AddCustom("lastname", "Doe").
 AddCustom("email", "[email protected]").
 Build()

Это позволяет вам иметь правило, подобное email eq "[email protected]", для выбора конкретного пользователя с вашим флагом.

Что дальше?

Как видите, go-feature-flag прост, и цель состоит в том, чтобы сделать его максимально простым. Но это не значит, что все кончено.

На данный момент я вижу эволюционный путь для go-feature-flag: во-первых, он должен иметь возможность хранить файл конфигурации флага где угодно, поэтому мы должны поддерживать больше ретрансляторов. Во-вторых, нужно получить больше отзывов. На данный момент мы кое-что регистрируем, но, возможно, некоторые пользователи захотят использовать веб-перехватчик или уведомление Slack.

go-feature-flag также открыт для участия, поэтому, если вы хотите поделиться какими-либо идеями или помочь, я бы очень хотел услышать от вас, что вы думаете об этой библиотеке и что вы хотите Это.

Так что не стесняйтесь писать обсуждение на GitHub, открывать проблему или отправлять мне электронное письмо.