← Назад к вопросам

Расскажи про свой опыт проектирования интеграций

1.6 Junior🔥 231 комментариев
#Опыт и проекты#Софт-скиллы и мотивация

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Мой опыт проектирования интеграций

Интеграции — это один из наиболее сложных и критичных аспектов работы системного аналитика. За 10+ лет я проектировал интеграции с десятками систем: платежные шлюзы, CRM, ERP, банки, маркетплейсы. Поделюсь практическим опытом и ошибками которые я делал.

Почему интеграции сложные

Причина 1: Вы не контролируете внешние системы

Если платежная система Stripe упадет, вы не сможете обработать платежи. Но вы не можете ничего с этим сделать кроме как иметь backup интеграцию.

Причина 2: Множество технологий

Одна система использует REST API, другая — SOAP, третья — File-based EDI, четвертая — WebSocket. Каждая требует разного подхода.

Причина 3: Частые изменения

Внешняя система обновилась и изменилась ее API. Теперь ваша интеграция сломалась.

Причина 4: Синхронизация данных

Когда два система должны иметь одинаковые данные, всегда появляются рассинхронизации.

Основные типы интеграций

1. Synchronous (Синхронные) интеграции

Описание: System A вызывает System B, ждет ответ.

User clicks "Pay" 
  -> My System calls Stripe API
  -> Stripe returns transaction ID
  -> My System saves transaction
  -> Return confirmation to user

Пример: Payment processing, user authentication (OAuth)

Плюсы:

  • Простая для понимания
  • Синхронная обработка (все linear)

Минусы:

  • Если Stripe упадет, весь процесс упадет
  • Slow (зависит от скорости Stripe)
  • Timeout issues

Когда использовать: Когда результат нужен сразу (платежи, логины)

2. Asynchronous (Асинхронные) интеграции

Описание: System A отправляет сообщение в очередь, System B обрабатывает когда может.

User clicks "Send email"
  -> My System puts message in queue
  -> Return to user immediately
  -> Email service reads from queue and sends email

Пример: Email notifications, log processing, analytics

Плюсы:

  • System A не ждет
  • Если Email Service упадет, сообщения сохранены в очереди
  • Можно перерабатывать сообщения если ошибка

Минусы:

  • Сложнее отследить ошибки
  • Данные могут быть обработаны с задержкой
  • Нужна очередь сообщений (Kafka, RabbitMQ)

Когда использовать: Когда результат не нужен сразу

3. Batch (Пакетные) интеграции

Описание: Данные обмениваются один раз в день (или неделю) в виде файлов.

22:00 UTC: System A exports all data to CSV/XML
22:01 UTC: File uploaded to SFTP
22:02 UTC: System B downloads file
22:05 UTC: System B parses and imports data

Пример: Retail inventory sync, reconciliation reports, EDI с партнерами

Плюсы:

  • Простая технически
  • Можно обрабатывать большие объемы
  • Если что-то упадет, можно переимпортировать

Минусы:

  • Данные обновляются не в реальном времени
  • Нужно обрабатывать duplicates
  • File management сложен

Когда использовать: Когда real-time не нужен, volume большой

4. Real-time streaming

Описание: Данные текут постоянно через Kafka, Kinesis, WebSocket

System A -> Kafka -> System B
System A -> Kafka -> System C
System A -> Kafka -> System D

Пример: Stock quotes, real-time notifications, clickstream analytics

Плюсы:

  • Real-time
  • Scalable (множество потребителей)
  • Fault-tolerant (Kafka хранит сообщения)

Минусы:

  • Дорого
  • Сложнее тестировать
  • Ordering гарантий может быть сложно обеспечить

Когда использовать: Когда нужен real-time и high volume

Сложный пример: Интеграция маркетплейса

Один из самых сложных проектов был интеграция с Яндекс.Маркетом (теперь Маркетплейс) и Avito.

Требования:

  1. Синхронизация товаров

    • При создании товара в нашей системе, автоматически создать на маркетплейсе
    • При обновлении цены, обновить на маркетплейсе
    • При удалении товара, удалить с маркетплейса
  2. Синхронизация заказов

    • Когда заказ на маркетплейсе, создать заказ в нашей системе
    • Обновить статус заказа в обе стороны
  3. Синхронизация инвентаря

    • Когда товар продан на маркетплейсе, уменьшить stock в нашей системе
    • Когда товар остался только 5 штук, уменьшить количество на маркетплейсе
  4. Обработка ошибок

    • Если запрос на маркетплейс упадет, сохранить и переправить позже
    • Если товар создался в нашей системе но не на маркетплейсе, как узнать?

Архитектура интеграции:

Наша система -> Background job -> Marketplace API
     ^
     |
     +-- Queue (Redis)

Marketplace API webhook -> Наша система -> Update DB

Детали:

  1. Product sync (Our system -> Marketplace)
When product created/updated/deleted:
  -> Put message in "product-sync-queue"
  -> Background job (runs every 5 seconds):
    -> Get message from queue
    -> Call Marketplace API
    -> If success: mark as synced
    -> If error: retry up to 3 times
    -> If still failing after 3 times: alert ops team
  1. Order sync (Marketplace -> Our system)
Marketplace sends webhook to:
  POST /webhook/marketplace/order

Payload:
{
  "event": "order.created",
  "order_id": "external-123",
  "items": [...],
  "timestamp": "2024-01-15T10:30:00Z"
}

Our system:
  -> Validate signature (webhooks must be signed)
  -> Create order in DB
  -> Return 200 OK immediately
  -> Process async (inventory update, notification, etc)

If we return 200 but internal processing fails:
  -> Marketplace assumes success
  -> We must retry the processing
  -> Idempotency key in webhook so we don't create duplicate orders
  1. Inventory sync (Both directions)

Это самое сложное потому что может быть race condition:

Time 1: User A buys on Marketplace
Time 2: User B buys on Our site
Time 3: Inventory update from Marketplace arrives to us
Time 4: Our inventory sync runs and sends to Marketplace

Result: Inconsistent stock!

Решение: Idempotent inventory updates

Each sync contains FULL state not deltas:

Marketplace sync: "Product 123 now has 45 units"
  not "Product 123 sold 1 unit"

Our sync: "Product 456 now has 78 units"
  not "Product 456 sold 2 units"

If message is processed twice (due to retry), same result.
  1. Webhook reliability
Marketplace might send webhook multiple times:
  - Due to our timeout
  - Due to their retry logic
  - Due to network issues

Solution: Idempotency key (provided by Marketplace)

When processing webhook:
  -> Check if this idempotency_key was processed
  -> If yes: return 200 (don't process again)
  -> If no: process and save idempotency_key

Проблемы которые я встречал

Проблема 1: Slow API

Ситуация: Экспорт 10,000 товаров на маркетплейс занимает 2 часа.

В первый раз я делал:

for product in products:
    response = requests.post(marketplace_api, product_data)
    # 1 запрос = 1 секунда
    # 10,000 товаров = 10,000 секунд = 2.7 часа

Решение:

  • Использовать batch API: отправлять 100 товаров в одном запросе
  • Параллельные запросы (5-10 одновременно)
  • Результат: 2 часа -> 10 минут

Проблема 2: Rate limiting

Ситуация: Маркетплейс может отказать если мы отправляем > 100 запросов в минуту.

Решение:

  • Реализовать exponential backoff
  • Если ошибка 429 (Too Many Requests), ждем и повторяем
  • Распределить нагрузку равномерно (не все товары сразу)

Проблема 3: Версионирование API

Ситуация: Маркетплейс обновил API с v1 на v2. Старые запросы уже не работают.

Решение:

  • Всегда использовать версионированный endpoint (/api/v1/, не /api/)
  • Иметь adapter layer что может переключаться между версиями
  • Давать достаточно времени для миграции (6+ месяцев)

Проблема 4: Certification vs Reality

Ситуация: Маркетплейс документация говорит что field "price" всегда присутствует. На практике иногда отсутствует.

Решение:

  • Не верить документации полностью
  • Обрабатывать edge cases
  • Иметь алерты когда получаем неожиданный формат

Лучшие практики для интеграций

1. Документирование

## Integration: Marketplace Orders

### Overview
- Marketplace sends us webhooks when order created
- We create order in our DB
- We sync status changes back to Marketplace

### API Endpoint
POST /webhook/marketplace/order

### Authentication
- Webhook signature verification using HMAC-SHA256
- Secret key stored in env var MARKETPLACE_SECRET

### Data format
- JSON
- Charset: UTF-8

### Retry policy
- Idempotency key: marketplace_order_id
- If we return non-2xx, Marketplace retries for 24 hours

### Monitoring
- Alert if webhook fails for 1 hour
- Alert if webhook latency exceeds 5 seconds

2. Graceful degradation

Если интеграция упадет, система должна работать.

Идеальный сценарий:
- Маркетплейс работает
- Наша система работает
- Интеграция работает

Какой-то из трех упал:
- Маркетплейс down: пользователи могут заказывать на нашем сайте
- Наша система down: заказы копятся в Marketplace, обработаются когда мы восстанемся
- Интеграция down: заказы копятся, manual reconciliation позже

3. Monitoring и alerting

Метрики для отслеживания:
- Количество успешных sync
- Количество failed sync
- Time lag между системами
- API response time
- Webhook latency

Алерты:
- Если sync failed более 10 раз подряд
- Если lag больше 1 часа
- Если API response time > 10 сек
- Если webhook не получали более 1 часа

4. Testing

Unit tests:
- Parsing webhook
- Data transformation
- Business logic

Integration tests:
- Mock external API
- Test error scenarios
- Test idempotency

E2E tests:
- In staging: actual API calls
- Verify end-to-end flow
- Test edge cases

Load tests:
- Can we handle 1000 orders/min?
- What's our throughput limit?

5. Rollback plan

Что если новая версия интеграции сломалась?
- Быстрый rollback к previous version
- Сохранить данные которые не обработались
- Manual intervention process

Когда я бы избежал интеграции

  1. Если можно экспортировать данные вручную Интеграция имеет смысл только если данные обновляются часто.

  2. Если партнер очень нестабилен Если их API down часто, интеграция больше проблем чем пользы.

  3. Если volume слишком мал Если обновляется 10 товаров в месяц, batch export проще.

Вывод

Хорошая интеграция требует:

  • Глубокого понимания обе системы
  • Handling ошибок и edge cases
  • Monitoring и alerting
  • Graceful degradation
  • Хорошей документации

Не все интеграции одинаковые. Выбор sync vs async vs batch зависит от requirements. И всегда помните: внешние системы могут упасть в 3 часа ночи, ваша система должна справиться.

Расскажи про свой опыт проектирования интеграций | PrepBro