Lexora

Продакшн-бэкенд на Rust с событийным ядром: transactional outbox, фоновые воркеры и фронтенд на React, всё на Cloud Run.

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

Задача

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

Система

Бэкенд на Rust вокруг событийного ядра. Изменение состояния и порождаемые им события фиксируются вместе через transactional outbox, а фоновые воркеры забирают эти события и выполняют медленную работу вне запроса. Сверху фронтенд на React, и всё это работает на Cloud Run.

Моя роль

Архитектура бэкенда и реализация событийного ядра, дизайн outbox и воркеров, а также операционная история в проде.

Самое сложное

Гарантии доставки. Между записью в базу и уведомлением остальной системы есть окно, в котором падение теряет событие. Закрыть это окно без распределённой транзакции это фактически весь дизайн.

Архитектурные решения

  1. Transactional outbox вместо двойной записи. Событие фиксируется в той же транзакции, что и изменение состояния, поэтому никогда не бывает момента, когда одно существует без другого.
  2. Доставка как минимум один раз с идемпотентными потребителями. Дубликаты обходятся намного дешевле потерь, поэтому воркеры написаны так, чтобы спокойно видеть одно событие дважды.
  3. Воркеры вне пути запроса. Медленная или сбойная работа ниже по течению проявляется как сниженная пропускная способность, которую надо нагнать, а не как ошибка тому, кто нажал кнопку.

Текущее состояние

В проде. Red Sentra продолжает сопровождать и развивать его.