Веб-сервисы
Веб-сервис предоставляет машинный интерфейс по сети. HTTP часто используется как транспорт, но сам по себе не определяет стиль контракта: поверх него могут работать REST API, SOAP, RPC и event streaming.
Контракт
Хороший контракт отвечает на вопросы:
- какой endpoint и метод вызвать;
- какая схема request/response;
- какие статусы и ошибки возможны;
- как передаётся аутентификация;
- что можно безопасно повторить;
- как меняются версии.
sequenceDiagram participant C as Client participant S as Service C->>S: request + correlation id alt success S-->>C: 2xx + representation else client error S-->>C: 4xx + structured problem else temporary failure S-->>C: 5xx / timeout end
REST, SOAP и RPC
| Подход | Центр модели | Сильная сторона | Цена |
|---|---|---|---|
| REST-like HTTP | ресурсы и HTTP semantics | понятность инфраструктуре, caching | дисциплина URI и методов |
| SOAP | формальный XML envelope и контракт | зрелые enterprise-стандарты | сложность и объём |
| RPC | вызываемая операция | естественная модель команд | транспортные детали могут стать невидимыми |
Ни один стиль автоматически не обеспечивает надёжность. Timeouts, retries, idempotency, versioning и observability проектируются отдельно.
Синхронное взаимодействие
У синхронного запроса клиент ждёт ответ и разделяет failure window сервера. Нужны:
- connect/read/total timeout;
- ограниченный retry только для подходящих ошибок и операций;
- jitter, чтобы клиенты не повторяли одновременно;
- circuit breaker при повторяющихся сбоях;
- correlation id и метрики latency/error rate.
Асинхронная операция
Долгую работу можно представить ресурсом операции:
POST /reports -> 202 + /operations/abc
GET /operations/abc -> status=RUNNING
GET /operations/abc -> status=COMPLETED, result=...Это явнее, чем держать HTTP connection до завершения.
Типичные сбои
- Клиент повторяет POST после timeout и создаёт дубликат.
- API возвращает stack trace и внутреннюю модель данных.
- Timeout клиента длиннее всего допустимого пользовательского бюджета.
- Версия сервера выкатывается раньше совместимого клиента.
- Один экран делает десятки последовательных запросов. См. Кейс сетевой N plus 1.
Вопросы для собеседования
Является ли любой HTTP API REST? Нет; HTTP может транспортировать RPC, SOAP и другие модели.
Что входит в контракт кроме JSON-схемы? Methods, URI, statuses, errors, auth, повторяемость и правила versioning.
Почему timeout обязателен? Без него зависший downstream удерживает threads/connections неопределённо долго.
Когда удобен асинхронный endpoint? Когда операция дольше разумного request timeout или требует отдельного прогресса.