Event
Один входящий запрос с данными события и результатом проверки. Принятое событие запускает подбор получателей; дубликат или отказ — нет.
Принимает HTTP-события, выбирает получателей по настраиваемым правилам, создаёт отдельную отправку для каждого совпадения и хранит историю доставки.
Сервис принимает HTTP-события от рекламных, аналитических и продуктовых систем и проверяет ключ источника и обязательные поля. Для каждого бренда он находит включённые Watcher — настройки маршрутов — и проверяет связанные с ними Rule: условия для событий, данные получателя и лимиты отправки. В условии можно использовать настроенный макрос: выбрать поле события, преобразовать его и передать результат правилу. Для каждого совпадения создаётся отдельный HTTP-запрос. Повторное событие с тем же ключом в течение 24 часов считается дубликатом. Сервис использует две базы PostgreSQL: одна хранит настройки платформ, брендов, источников, Watcher, Rule и макросов; вторая транзакционно хранит принятые события и очереди обработки и отправки. В ClickHouse событие копируется после приёма, решения маршрутизации — после выбора получателей, а отправки и попытки — после получения итогового статуса. Записи PostgreSQL удаляются только после проверки копии в ClickHouse.
Одно событие нужно отправить в несколько систем, у каждой — свои условия и формат запроса. Сервис выбирает получателей, повторяет временно неудачные отправки и сохраняет результаты для операторов.
Команды, связывающие рекламные, аналитические и продуктовые системы событиями; сотрудники операций, которые настраивают правила и разбирают ошибки доставки.
Один входящий запрос с данными события и результатом проверки. Принятое событие запускает подбор получателей; дубликат или отказ — нет.
Включённая настройка получателя для бренда. Её условия определяют, нужно ли рассматривать событие для отправки.
Задаёт условия события, поля запроса и лимиты отправки для маршрута. При совпадении для получателя создаётся отдельный Postback.
Оператор выбирает поле payload, поддерживаемую функцию преобразования текста и её параметры. Полученное значение можно использовать в условии Rule и проверить до применения правила.
Postback хранит подготовленный запрос для одного получателя; задача доставки — попытки, ответы, время повтора и итоговый статус.
Четыре этапа показывают, что хранится, как применяются правила, когда повторяется отправка и в какой момент данные попадают в ClickHouse.
Каждый запрос сохраняется; маршрутизация запускается только для первого принятого события.
Отправляет событие с ключом платформы и данными события.
Сверяет платформу и бренд с настройками, проверяет ключ и обязательные поля.
Одна транзакция с advisory lock проверяет ключ события за последние 24 часа и записывает событие вместе с решением о приёме.
Отдельная административная PostgreSQL: платформы, бренды, ключи источников, Watcher, Rule и макросы.
Fan-out worker превращает принятое событие в отдельную задачу для каждого подходящего получателя.
Worker захватывает событие через SKIP LOCKED; параллельные worker могут брать другие события.
Связь с брендом определяет, какие Watcher должны проверить событие.
Rule проверяет событие и лимиты отправки. Макрос может взять поле payload, преобразовать его настроенной функцией по разделителю и передать результат в условие правила.
Для каждого подошедшего получателя создаётся отдельный запрос. Решение и причина записываются вместе с ним.
HTTP-вызов выполняется вне транзакции БД; lease определяет, какой worker может записать результат.
Worker временно резервирует задачу. Если резерв истёк, старый worker не сможет перезаписать результат новой попытки.
Отправить запрос, собранный по правилу, и сохранить статус и ответ этой попытки.
Каждая запись синхронизируется, когда её состояние готово; из PostgreSQL она удаляется только после проверки копии в ClickHouse.
Версионная история событий, решений и доставок для фильтров и отчётов.
Перед удалением записи PostgreSQL задача очистки проверяет, что соответствующая строка есть в ClickHouse.
Сверить платформу, бренд, ключ источника и обязательные поля события.
API сохраняет результат приёма в PostgreSQL для обработки. Настройки источника и бренда находятся в отдельной административной PostgreSQL базе.
Сохранить каждый запрос. Если то же принятое событие пришло повторно в течение 24 часов, отметить дубликат и не запускать маршрутизацию ещё раз.
Транзакционная advisory-блокировка защищает проверку ключа идемпотентности при записи события.
Проверить событие и бренд по каждому включённому Watcher и его Rules.
Настроенный макрос берёт поле payload, применяет поддерживаемое преобразование текста и передаёт результат в условие Rule. Совпавшее правило собирает запрос получателя и проверяет лимиты.
Создать отдельный Postback для каждого получателя, у которого совпало Rule.
Worker захватывает события через SKIP LOCKED. Postback, решения по маршрутам и завершение обработки события сохраняются одной транзакцией.
Захватить ожидающий Postback и вызвать URL получателя.
HTTP-вызов выполняется вне транзакции БД. Lease-токен не даёт просроченному worker перезаписать более новый результат.
Сохранить ответ и номер попытки. Повторить временную ошибку HTTP 429, 5xx или сети после задержки.
Успешная отправка, постоянная ошибка и исчерпание повторов получают итоговый статус и историю попыток. Если worker остановится после отправки, но до записи ответа, сервис может повторить запрос.
Скопировать событие после приёма, решения Watcher/Rule после маршрутизации, а Postback с попытками — после завершения доставки.
Синхронизация выполняется асинхронно и повторяет неудачные копирования. Worker отмечает строки PostgreSQL после успешного копирования; очистка сначала проверяет соответствующую запись в ClickHouse и только затем удаляет оперативные данные.
Транзакции PostgreSQL защищают принятые события, решения маршрутизации, задачи отправки и их текущее состояние.
Worker резервирует отправку, выполняет сетевой вызов вне транзакции и сохраняет ответ, только пока владеет lease.
События, решения правил и попытки доставки копируются по достижении своего этапа синхронизации; строки PostgreSQL очищаются только после появления копии.
Расскажите, что должно делать приложение, как команда работает сейчас и какие требования или сроки важно учесть.