Go Systems Architecture: APIs, Integrations & AI

Соберёте на Go сервис заказов, который переживает чужие сбои, и докажете это журналами партнёров: одно списание, один возврат, ни одной лишней отправки. Чаще всего ломается стык с чужой системой: вебхук приходит дважды и не по порядку, платёжка отвечает 429, провайдер модели отвечает 529 от перегрузки. Ставить ничего не нужно: решение собирается в песочнице курса, где PostgreSQL, моки партнёров и модели уже подняты.

Чему вы научитесь

Что делать с вебхуком, который пришёл дважды?

Партнёр не дождался ответа и прислал ту же попытку снова. Событие 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. Задачи с кодом проверяются автоматически.

  1. Архитектурные решения и границы

  2. Эволюция публичного API

  3. Идемпотентность, долгие операции и SDK

  4. Клиенты к чужим API

  5. Вебхуки: приём и отправка

  6. Outbox и inbox: доставка без потерь

  7. Саги, компенсации и сверка

  8. Тестирование интеграций

  9. Наблюдаемость интеграций

  10. Безопасность межсистемных связей

  11. LLM-шлюз на Go

  12. Инструменты, RAG и MCP в Go-системе

  13. Финальный проект: сквозная система

Стоимость курса: 19990 ₽

Открыть курс на Mentorix · Все курсы