Через год после закрытия проекта я открыл его код и устроил себе code review. Это был автомобильный маркетплейс объявлений, который я в одиночку спроектировал, написал, задеплоил и сопровождал: React‑фронтенд, три бэкенда на NestJS, PostgreSQL, чат на Socket.IO, интеграция платежей, Kubernetes в GKE, CI/CD, CronJob'ы и E2E.
Рубрика «outbox»
Один разработчик, пять сервисов, три базы: что я понял об архитектуре, когда пришлось самому всё деплоить и чинить
2026-10-06 в 7:11, admin, рубрики: cronjob, kubernetes, lost-update, nestjs, outbox, postgresql, socket.io, архитектура, идемпотентностьКод-ревью самому себе через год: 8 архитектурных ошибок соло-проекта
2026-10-06 в 7:11, admin, рубрики: cronjob, kubernetes, lost-update, nestjs, outbox, postgresql, socket.io, архитектура, идемпотентностьЧерез год после закрытия проекта я открыл его код и устроил себе code review. Это был автомобильный маркетплейс объявлений, который я в одиночку спроектировал, написал, задеплоил и сопровождал: React‑фронтенд, три бэкенда на NestJS, PostgreSQL, чат на Socket.IO, интеграция платежей, Kubernetes в GKE, CI/CD, CronJob'ы и E2E.
Привет! Меня зовут Серёжа. Я работаю Java‑разработчиком. В этой статье хочу поделиться своим первым опытом реализации паттерна «outbox».
Решил я это сделать по нескольким причинам:
-
Зафиксировать для себя «на бумаге» архитектурное решение и полученный опыт.
-
Поделиться знаниями и идеями с теми разработчиками, кому только предстоит впервые выполнить похожую задачу.
-
Получить от профессионалов комментарии и замечания по улучшению моего решения.
Итак, давайте начнём!
Что вообще за outbox и зачем он нужен?
Почему Kafka недостаточно: гарантированная доставка сообщений в распределённых системах
2026-03-20 в 5:45, admin, рубрики: ibox, outbox, гарантированная доставка сообщений, микросервисы, согласованность1. Введение
Kafka часто воспринимается как система, гарантирующая доставку сообщений и Exactly Once Semantics. Однако в реальных распределённых системах эти гарантии заканчиваются на границе брокера.
Сообщение может потеряться между записью в базу данных и публикацией события, а может быть обработано повторно при сбое сервиса.
В этой статье разберём:
-
где именно теряются гарантии Kafka
-
почему Exactly Once не работает на уровне всей системы
-
и как паттерны Outbox / Inbox помогают решить эту проблему.
2. Контекст: микросервисы и асинхронное взаимодействие
Паттерн Transactional Outbox
2025-02-02 в 14:15, admin, рубрики: outbox, transactional outbox, атомарность, идемпотентность, Программирование, согласованность, транзакцииКакую потенциальную проблему видите в коде?
await _applicationService.Create(application);
await _queue.Publish(new ApplicationCreatedEvent(application));
Сначала создается заявка в БД, после событие о создании отправляется в брокер сообщений(MQ) для оповещения другого сервиса о появлении новой заявки.
Здесь может произойти ошибка в момент отправки события в очередь, когда наша сущность уже создана в БД.
Это приведет к несогласованному состоянию, так как заявка будет хранится только в нашей системе, а другая система не узнает о ней.
Как мы в Delivery Club outbox оптимизировали
2024-10-07 в 11:03, admin, рубрики: highload, outbox, performance, queue, vacuumПривет! Решил написать небольшую техническую статью о том, как мы ускорили запрос в таблицу, до которой не доходил autovacuum из-за большой нагрузки на БД примерно в 200 раз, а разгребание outbox очереди — ещё примерно в 3 раза.
Дисклеймер
Для понимания статьи понадобится кое-какое знание PostgreSql и микро-сервисов, углубляться в это я не могу: из-за этого статья разрастётся до неприличных масштабов, но приложу краткий список ссылок на материалы, где всё объяснено подробно:
Calypso: Схема данных MongoDB на Scala
2023-12-25 в 12:17, admin, рубрики: adt, algebraic data types, DDD, functional programming, mongodb, nosql, outbox, scala, Scala3Введение
Чтобы применять Domain-Driven Design, DDD Aggregate и Transactional outbox на MongoDB, наша команда создала open source — библиотеку calypso для работы с BSON.
Публикация для тех, кто стремится к современным практикам разработки и разделяет наше влечение к Scala 3.
Готовы к открытиям? Добро пожаловать в мир функционального программирования и надёжной работы с schema-on-read.
План
-
моделирование предметной области с использованием ADT;
-
конвертация модели предметной области в BSON;
-
работа с библиотекой calypso на Scala 3;
-
эволюция схемы данных MongoDB;
-
практики работы с schema-on-read.
