Lexora
Продакшн-бэкенд на Rust с событийным ядром: transactional outbox, фоновые воркеры и фронтенд на React, всё на Cloud Run.
- Принадлежность
- Заказной продукт, разработанный совместно. Red Sentra продолжает его сопровождать. Договорённости о собственности и партнёр остаются приватными.
- Доступность
- Живой продукт. Исходный код приватный.
- Стек
- Rust / React / Cloud Run / Background workers

Задача
Продукт, где одно действие пользователя должно запустить несколько последствий ниже по течению, и ни одно из них не имеет права тихо не произойти. Наивный вариант, когда побочные эффекты выполняются внутри запроса, теряет работу каждый раз, когда что-то падает на полпути.
Система
Бэкенд на Rust вокруг событийного ядра. Изменение состояния и порождаемые им события фиксируются вместе через transactional outbox, а фоновые воркеры забирают эти события и выполняют медленную работу вне запроса. Сверху фронтенд на React, и всё это работает на Cloud Run.
Моя роль
Архитектура бэкенда и реализация событийного ядра, дизайн outbox и воркеров, а также операционная история в проде.
Самое сложное
Гарантии доставки. Между записью в базу и уведомлением остальной системы есть окно, в котором падение теряет событие. Закрыть это окно без распределённой транзакции это фактически весь дизайн.
Архитектурные решения
- Transactional outbox вместо двойной записи. Событие фиксируется в той же транзакции, что и изменение состояния, поэтому никогда не бывает момента, когда одно существует без другого.
- Доставка как минимум один раз с идемпотентными потребителями. Дубликаты обходятся намного дешевле потерь, поэтому воркеры написаны так, чтобы спокойно видеть одно событие дважды.
- Воркеры вне пути запроса. Медленная или сбойная работа ниже по течению проявляется как сниженная пропускная способность, которую надо нагнать, а не как ошибка тому, кто нажал кнопку.
Текущее состояние
В проде. Red Sentra продолжает сопровождать и развивать его.