惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
The Blog of Author Tim Ferriss
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
有赞技术团队
有赞技术团队
量子位
S
SegmentFault 最新的问题
博客园 - 聂微东
博客园 - 【当耐特】
J
Java Code Geeks
美团技术团队
Hugging Face - Blog
Hugging Face - Blog
H
Help Net Security
V
V2EX
人人都是产品经理
人人都是产品经理
博客园 - Franky
罗磊的独立博客
Engineering at Meta
Engineering at Meta
A
About on SuperTechFans
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
云风的 BLOG
云风的 BLOG
Y
Y Combinator Blog
Apple Machine Learning Research
Apple Machine Learning Research

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания
Froggle — фича-флаги без боли
augustine_kp · 2026-04-28 · via Все публикации подряд на Хабре

Уровень сложностиПростой

Время на прочтение3 мин

Охват и читатели266

Бороздя

просторы космоса

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

В мире кубов и контейнеров JVM приложения чувствуют себя немного странного когда речь заходит о вопросах: кто сожрал все ресурсы в кластере? или как же мне вывернуть приложение чтобы не рестартить его? Со вторым вопросом предлагаю ознакомится ближе.
Механизм рефреша конфигураций есть:

  1. В спринге в виде /actuator/refresh, но он не гарантирует консистентность между всеми потоками приложения, риск race conditions и деградации приложения

  2. JMX — практически невозможен в продовой среде для наших целей

  3. Jolokia — риски безопасности, часто в read‑only в проде

Многие и многие менеджеры и продакты отдали бы многое за систему которая в рантайме изменяет поведение системы в один клик, да еще и с раскаткой на n% юзеров! (все же ведь любят канареек?)

Так о чем я, родилась идея легковесного хранилища/менеджера флагов для любых бэк-енд приложений, мобилок или фронт-энда через REST/GRPC взаимодействие.

Схема взаимодействия

Схема взаимодействия

Что есть что?
По своей сути система состоит из двух отдельных приложений:

1. evaltuation‑api
Отвечает за чтение состояния флагов, их правил и является элементом системы на которую подписываются клиенты ожидающие изменений во флагах. Хранит в кэше состояние флагов.
Подпись естественно в рамках GRPC (потому что так проще для начала)
2. core‑engine
Отвечает за создание, изменение, удаление флагов на условном дашборде или api. Является центровым в этой архитектуре, поскольку:
а) менеджит состояние
б) пушит через канал (pg‑notify so far) обновление напрямую в evaluation‑api

Структура флага проста как мир

create table flags
(
    id            uuid                     default gen_random_uuid() not null
        primary key,
    key           text                                               not null
        unique,
    description   text,
    enabled       boolean                  default false             not null,
    default_value boolean                  default false             not null,
    created_at    timestamp with time zone default now()             not null,
    updated_at    timestamp with time zone default now()             not null,
    status        text                     default 'draft'::text     not null
        constraint flags_status_check
            check (status = ANY
                   (ARRAY ['draft'::text, 'active'::text, 'inactive'::text, 'deprecated'::text, 'archived'::text]))
);
  • key — самое важное о чем спрашивают подписанные клиенты

  • status — простой статус для жизненным циклом флага

  • default_value — с каким статусом создался флаг

  • enabled — свойство включен ли флаг?

У флагов предусмотрены опциональные условия, которым должены удовлетворить параметры передаваемые клиентами

create table targeting_rules
(
    id           uuid                     default gen_random_uuid() not null
        primary key,
    flag_id      uuid                                               not null
        references flags
            on delete cascade,
    priority     smallint                                           not null,
    attribute    text                                               not null,
    operator     text                                               not null,
    value        jsonb                                              not null,
    return_value boolean                                            not null,
    created_at   timestamp with time zone default now()             not null,
    unique (flag_id, priority)
);

  • flag_id — с каким флагом связано правило
    attribute — название параметра сравнения

  • operator — eq, neq, in, not_in,

  • value - целевое значение аттрибута

  • return_value - что вернуть если правило совпало, пока boolean, возможны расширения до любого типа

В базовом виде вот и весь состав системы и флагов, клиент передает в evaluation‑api набор параметров, evaluation‑api получает данные о флаге, если их нет в кэше из бд, кеширует и отдает клиенту его значение. В случае обновления core‑engire через pg_notify пушит изменения флага в evaluation‑api и тот в свою очередь кеширует их, либо пушит изменения подписчикам GRPC.

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