Чтобы разделить деплой и релиз фичи, мы внедрили простой сервис feature flags. Вместо тяжёлых решений типа LaunchDarkly — свой минимальный сервис на Go:
// Таблица в PostgreSQL
// CREATE TABLE feature_flags (
// key varchar(100) PRIMARY KEY,
// enabled boolean NOT NULL DEFAULT false,
// rules jsonb,
// updated_at timestamptz DEFAULT now()
// );
type FlagService struct {
db *sql.DB
cache *sync.Map // локальный кэш, обновляется каждые 10 секунд
}
type Flag struct {
Key string `json:"key"`
Enabled bool `json:"enabled"`
Rules json.RawMessage `json:"rules"`
}
func (s *FlagService) IsEnabled(ctx context.Context, key string, attrs map[string]string) bool {
// Проверяем кэш
if cached, ok := s.cache.Load(key); ok {
flag := cached.(*Flag)
if !flag.Enabled {
return false
}
return s.evaluateRules(flag.Rules, attrs)
}
return false
}
// Использование в приложении:
func (h *AppointmentHandler) CreateAppointment(w http.ResponseWriter, r *http.Request) {
// ...
if h.flags.IsEnabled(r.Context(), "video-consultation", map[string]string{
"user_id": userID,
"clinic_id": clinicID,
}) {
// Новая логика видеоконсультаций
h.setupVideoRoom(ctx, appointment)
}
// ...
}
Это позволяет деплоить код с выключенной фичей, включать её для 5% пользователей, постепенно увеличивать до 100%, и мгновенно выключить, если что-то пойдёт не так — без деплоя.
Оставить комментарий