Go Systems Architecture: APIs, Integrations & AI
Соберёте на Go сервис заказов, который переживает чужие сбои, и докажете это журналами партнёров: одно списание, один возврат, ни одной лишней отправки. Чаще всего ломается стык с чужой системой: вебхук приходит дважды и не по порядку, платёжка отвечает 429, провайдер модели отвечает 529 от перегрузки. Ставить ничего не нужно: решение собирается в песочнице курса, где PostgreSQL, моки партнёров и модели уже подняты.
Чему вы научитесь
- Менять публичный API, не ломая старых клиентов: OpenAPI-first, oasdiff в CI, версии по датам, курсорная пагинация, ETag и If-Match, ошибки в формате Problem Details
- Принимать повторные запросы без двойного эффекта: Idempotency-Key, долгие операции с ответом 202 и свой SDK для клиентов
- Писать клиентов к чужим API: таймауты по фазам, повторы с учётом Retry-After, circuit breaker и bulkhead на каждую зависимость, общий лимит на квоту партнёра
- Принимать и отправлять вебхуки: подпись и допуск по времени, быстрый ответ после записи в inbox, доставка подписчикам с повторами, защита от SSRF
- Доставлять события без потерь: transactional outbox, ретранслятор в NATS JetStream, идемпотентный консюмер, DLQ для отравленных сообщений
- Вести саги с компенсациями: оркестратор на PostgreSQL переживает падение процесса посреди шага, семантические блокировки и ежедневная сверка с отчётом партнёра
- Тестировать и наблюдать интеграции: контрактные тесты, сбои через toxiproxy, testing/synctest, трейсы через очереди и вебхуки
- Защищать связи между системами: OAuth2 client credentials, mTLS с ротацией сертификатов без рестарта, хранение и ротация секретов
- Строить LLM-шлюз на Go: тенанты и ключи, маршрутизация по таблице моделей, резервный провайдер, бюджеты токенов, кэш и стриминг
- Подключать модель к системе: инструменты с правами пользователя, подтверждение опасных действий, RAG на pgvector, MCP-сервер и защита от prompt injection через данные партнёров
Что делать с вебхуком, который пришёл дважды?
Партнёр не дождался ответа и прислал ту же попытку снова. Событие created пришло позже succeeded. Кто-то пересобрал тело через json.Marshal, и подпись перестала сходиться. Вердикты на картинке получены настоящим прогоном проверки подписи по Standard Webhooks и SQL в PostgreSQL 16.
Подпись считается от сырых байт тела, а свежесть отсекает метку старше 300 секунд. От повтора защищает первичный ключ inbox, от перестановки защищает версия ресурса. Без проверки версии та же лента откатывает оплаченный заказ в created.
Что сломается у старого клиента?
Сравнение схем ловит структуру, но не поведение. Поле shipping_fee было в рублях, после смены провайдера стало в копейках: число осталось числом, и ни строгий, ни терпимый декодер разницы не увидят. Клиент покажет «250» там, где должно быть «2.50».
Курс учит смотреть на изменение глазами старого клиента. Новое значение статуса проваливается через switch без default, сменившаяся сортировка по умолчанию подсовывает в баннер самый старый заказ. Ещё одна ловушка: oasdiff breaking без флага -o возвращает код 0 даже при находке уровня error.
В лабе про новую версию API чекер прогоняет oasdiff между вашей спецификацией и версией 1.0, а ответы сервиса читает строгим декодером старого клиента с DisallowUnknownFields.
Что нужно знать
Go на уровне рабочего сервиса: net/http, context и его отмена, горутины и каналы
SQL и работа с PostgreSQL из Go
REST, коды ответов, JWT и OAuth2, общее понимание брокеров сообщений: всё это есть в курсе «Golang: микросервисная архитектура, проектирование API», здесь основы не повторяются
Локально удобно иметь Go 1.26 и Docker с postgres:16-alpine, но сдача и проверка идут в песочнице
Сага остановилась на полпути
Сага заказа идёт через три системы, и любая может отказать на середине. Здесь shipit отказал навсегда уже после списания, а paygate несколько раз не принял возврат. Времена и коды на картинке сняты реальным прогоном оркестратора по условию лабы.
Где застрял заказ, видно по одной строке sagas: шаг, число попыток, charge_id. Все попытки возврата идут с одним ключом идемпотентности, поэтому двух возвратов не будет. В лабах чекер дополнительно убивает процесс сразу после списания и после запроса в shipit и сверяет, что в журналах по одной записи на заказ.
Модель просит вернуть деньги
Внешний агент подключается к вашему MCP-серверу и сам решает, какой инструмент вызвать. Поэтому защита живёт на сервере: токен проверяется до того, как SDK увидит JSON-RPC, а заказ отдаётся только владельцу.
Опасное действие не исполняется сразу. refund заводит ресурс ожидания, и деньги уходят только после решения человека. Аннотация destructiveHint лишь подсказывает интерфейсу клиента, настоящая граница здесь отложенное действие и политика.
Для кого
Go-разработчикам, чей сервис ходит к платёжкам, службам доставки и другим чужим API
Бэкенд-инженерам, которые принимают вебхуки и публикуют события и уже ловили дубли, потерянные события или двойные списания
Тем, кто встраивает модель в продукт и хочет держать ключи, бюджеты и опасные действия под контролем сервиса
Финальный прогон под сбоями
Финальный проект собирает всё в одну систему: сервис заказов с paygate, shipit, сервером авторизации и ассистентом поддержки за шлюзом модели. Один длинный прогон проходит шесть фаз: норма, деградация партнёра, всплеск вебхуков, отказ модели, атака через содержимое заказа и восстановление.
Результат приходит не одним «зачтено», а отчётом по требованиям. Строка вида «[MUST] деньги: повторная отправка с тем же Idempotency-Key создала вторую оплату, вердикт FAIL» блокирует приёмку целиком. Провал уровня SHOULD, например задержка выше цели, остаётся задачей на следующую итерацию.
Поддержка
Вы также можете задать любой вопрос по курсу у поддержки t.me/mentorix_support
Программа курса
Модулей: 13, уроков: 65. Задачи с кодом проверяются автоматически.
Архитектурные решения и границы
- Добро пожаловать: система курса и песочница
- ADR: решение, его контекст и цена
- Модульный монолит на Go: internal как граница
- Контексты и карта контекстов
- Anti-corruption layer: чужая модель не проходит внутрь
- Вынос модуля в сервис: strangler fig и теневой трафик
Эволюция публичного API
- Что ломает клиента в HTTP API
- OpenAPI-first и oasdiff в CI
- Версии по датам и вывод из эксплуатации
- Курсоры вместо offset: пагинация и фильтры
- Конкурентные изменения: ETag и If-Match
- Ошибки как контракт
Идемпотентность, долгие операции и SDK
- Idempotency-Key на уровне API
- Долгие операции: 202 и ресурс операции
- SDK для клиентов: генерация и ручной слой
- Практика: новая версия API и старые клиенты
Клиенты к чужим API
- Анатомия исходящего вызова: таймауты по фазам и пул
- Повторы с бюджетом и Retry-After
- Circuit breaker и bulkhead на зависимость
- Квоты партнёра: заголовки, лимитер и общий бюджет
- Синхронизация данных с партнёром
- Практика: устойчивый клиент платёжного провайдера
Вебхуки: приём и отправка
- Приём вебхука: подпись, время, повтор
- Быстрый ответ и inbox
- Отправка вебхуков: доставка, повторы, отключение
- SSRF: когда адрес подписчика ведёт внутрь
Outbox и inbox: доставка без потерь
- Двойная запись и transactional outbox
- Ретранслятор: из таблицы в брокер
- Inbox и идемпотентный консюмер
- События меняются: версии и совместимость
Саги, компенсации и сверка
- Сага: оркестрация и хореография
- Оркестратор саги на PostgreSQL
- Сага без изоляции: семантические блокировки
- Durable execution: когда сагу отдать движку
- Сверка с партнёром
Тестирование интеграций
- Контракты потребителя
- Тесты по спецификации
- Сбои по заказу: toxiproxy в тестах
- Время и асинхронность в тестах
Наблюдаемость интеграций
- Метрики на каждую зависимость
- Трейсы через очереди и вебхуки
- Журнал доставок и маскирование данных
- Бюджет ошибок партнёра и деградация
- Разбор инцидента интеграции
Безопасность межсистемных связей
- OAuth2 client credentials между сервисами
- mTLS и ротация сертификатов без рестарта
- Секреты интеграций: хранение и ротация
- Исходящий трафик и недоверенные ответы
LLM-шлюз на Go
- Свой шлюз к моделям: зачем и из чего
- Маршрутизация моделей и отказы провайдеров
- Токены, стоимость и бюджеты тенантов
- Кэш ответов и лимиты по токенам
- Стриминг через шлюз
- Журнал и трассировка шлюза
Инструменты, RAG и MCP в Go-системе
- Инструмент модели как API
- Опасные действия: подтверждение и политика
- RAG-сервис на Go: права и свежесть данных
- MCP-сервер на Go для вашей системы
- Prompt injection через данные интеграций
- Оценка AI-слоя как регрессионные тесты
Финальный проект: сквозная система
- Постановка и архитектура
- Публичный API и SDK проекта
- Интеграционный контур
- AI-слой системы
- Приёмка под сбоями
Стоимость курса: 19990 ₽
Открыть курс на Mentorix · Все курсы