Обсудить проект

Услуги / Backend

Backend-разработка сложных систем

Closeflow берёт на себя серверные системы, где важны корректность состояния, интеграции с внешними сервисами и поведение при сбоях: платёжные контуры, очереди и фоновая обработка, API для веб- и мобильных продуктов, внутренние платформы. Отвечаем за архитектуру, реализацию и передачу в эксплуатацию.

  • Go — основной язык
  • PostgreSQL · Redis
  • очереди · интеграции
  • договор · NDA

02Что строим

Что мы разрабатываем

Типичные задачи — там, где у серверной части есть состояние, деньги или зависимость от чужих систем.

  • API и серверная часть продуктов

    REST и WebSocket для веб- и мобильных приложений: авторизация, права доступа, мультитенантность, версионирование контрактов.

  • Внутренние платформы

    Админ-панели, отчётность, операционные инструменты. Всё, что команда использует каждый день и что не должно ломаться молча.

  • Интеграционные сервисы

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

  • Платёжные подсистемы и биллинг

    Приём платежей, учёт балансов, возвраты, сверка с провайдерами. Деньги нельзя терять и нельзя списывать дважды.

  • Фоновая обработка и очереди

    Воркеры с повторами и backoff, расписания, долгие операции, доставка вебхуков с подтверждением.

  • Системы со сложными переходами состояний

    Заказы, платежи, бронирования, согласования: явная модель состояний вместо набора флагов и условий.

03Где сложность

Где на самом деле возникает сложность

Обычно это не сами эндпоинты, а то, что происходит между ними.

  • Согласованность состояния

    Две операции, которые должны произойти вместе, рано или поздно разойдутся, если граница транзакции проведена не там.

  • Идемпотентность и повторы

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

  • Гонки и конкурентный доступ

    Два запроса на один баланс или один слот. Защита нужна на уровне базы, а не «в коде на всякий случай».

  • Отказы внешних зависимостей

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

  • Эволюция схемы и миграции

    Схему данных приходится менять на живой системе. Миграции должны быть версионированными, обратимыми по смыслу и безопасными для работающего кода.

  • Сверка данных

    Своя система и внешний провайдер иногда расходятся во мнениях о платеже или заказе. Расхождения нужно находить по расписанию, а не по жалобе пользователя.

  • Аутентификация, права и лимиты

    Кто что может делать, как ограничить злоупотребление, как не отдать данные одного клиента другому.

  • Контракты интеграций

    Чужой API меняется без предупреждения. Адаптер с явным контрактом и проверками изолирует эти изменения от остальной системы.

  • Наблюдаемость

    Без метрик, логов и трассировки отказ в очереди или у провайдера обнаруживается слишком поздно и разбирается наугад.

04Паттерны

Как проходит надёжная операция

Схема ниже — обобщённый путь запроса, который меняет состояние и обращается к внешнему сервису. Тот же каркас мы применяли в платёжных и интеграционных проектах.

Transactional outbox: изменение состояния и событие о нём пишутся одной транзакцией в PostgreSQL. Отдельный процесс доставляет событие дальше. Так нет ситуации, когда запись сохранена, а сообщение потеряно, или наоборот.

Ключи идемпотентности: повторный запрос с тем же ключом возвращает прежний результат, а параллельный дубль не создаёт вторую запись. Тогда доставка «как минимум один раз» даёт бизнес-эффект «ровно один раз».

Сверка: независимо от обработки в потоке, периодическая задача сравнивает данные системы с данными провайдера и поднимает расхождения. Это страховка от всего, что не предусмотрели.

Бухгалтерский журнал: в проекте независимого платёжного шлюза баланс опирается на двойную запись в ledger, а неизменяемость записей обеспечена триггерами на уровне базы данных (append-only). Возвраты в этой схеме работают по принципу fail-closed: при сомнении операция отклоняется, а не выполняется.

Схема: API, PostgreSQL, Outbox, Очередь, Воркер, Внешний API, Сверкаодна транзакцияAPIidempotency keyPostgreSQLсостояниеOutboxсобытие в той же txnОчередьAsynq · KafkaВоркерповторы · backoffВнешний APIтаймаут · retryСверкапо расписанию
fig. Состояние и событие записываются в одной транзакции. Всё, что находится ниже, может упасть и будет повторено без двойного эффекта.

05Стек

Языки и инструменты

Для новых систем основной язык — Go. Остальные технологии используем там, где они уже стоят в системе или у команды.

Основной язык

  • Go
  • REST
  • WebSocket
  • Asynq

Новые сервисы, платёжные и AI-платформы.

Python

  • Django
  • django-ninja
  • Celery
  • Channels
  • FastAPI

Существующие продукты и небольшие сервисы.

Java

  • Java 21
  • Spring Boot 3
  • Kafka

Node.js

  • Node.js
  • Express
  • TypeScript

Шлюзы и внутренние инструменты.

Данные

  • PostgreSQL
  • PostGIS
  • Redis
  • pgvector
  • Kafka / Redpanda

Эксплуатация

  • Docker
  • nginx
  • Prometheus
  • Grafana
  • OpenTelemetry
  • GitHub Actions

06С чего начинаем

Как мы начинаем работу

  1. Границы и сценарии отказов

    Выясняем, что система обязана гарантировать и что должно происходить, когда зависимость недоступна, а запрос пришёл дважды.

  2. Контракты и модель состояний

    Фиксируем схему данных, переходы состояний и интерфейсы с внешними системами до начала массового кода.

  3. Сквозной срез

    Собираем один работающий путь через всю систему: API, база, очередь, интеграция, деплой.

  4. Обработка сбоев и наблюдаемость

    Добавляем повторы, сверку, метрики и алерты, проверяем поведение при отказах.

  5. Передача

    Документация, развёртывание и понятное владение системой, чтобы она не зависела от автора.

07Когда подходит

Когда стоит обращаться

  • Существующий backend нужно перестроить

    Логика размазана по обработчикам, состояние рассинхронизируется, изменения становятся рискованными.

  • В продуктовой команде не хватает серверной экспертизы

    Нужен инженер, который возьмёт на себя серверную часть или усилит команду на несколько месяцев.

  • В планах много интеграций

    Каждая новая внешняя система приносит свои ошибки, лимиты и форматы.

  • Критична корректность денег и состояния

    Платежи, балансы, заказы, где ошибка превращается в прямой ущерб.

  • Подсистему можно сдать отдельно

    Платёжный модуль, интеграционный слой или фоновая обработка с чёткими границами.

  • AI-продукту нужна надёжная серверная основа

    Лимиты, биллинг, очереди и наблюдаемость вокруг вызовов моделей.

Есть серверная задача?

Опишите систему, ограничения и то, что сейчас болит. Ответим по существу и скажем, берёмся ли.

Обсудить backend-задачу

09Контакт

Расскажите, что
должно работать.

Опишите задачу, текущую систему и ограничения. Если проект подходит по профилю — предложим следующий шаг: обычно это короткий созвон с вопросами о данных, интеграциях и сроках.

brief.form4 поля · 2 минуты

Бюджет необязательно