Как организовать интеграцию с клиент операцион сервисом
Что проверяют
Формулировка намеренно размыта: «клиент операцион сервис» обычно внутренний сервис клиентских операций, например в банке. Смотрят, начнёте ли вы с вопросов о контракте и нагрузке и знаете ли, как сделать интеграцию устойчивой. Следом спрашивают, что делать, если ответ на операцию не пришёл из-за таймаута.
Как отвечать
Уточните: синхронный вызов или события, объём и SLA, есть ли OpenAPI или .proto, идемпотентны ли операции, как аутентифицироваться. Затем каркас:
- клиент: генерация из OpenAPI через
openapi-generatorилиRestClientиз Spring Framework 6.1 и новее,RestTemplateв режиме поддержки. Для gRPC стабы из.proto, для асинхронного обмена Kafka; - таймауты: connect и read задаются явно. У
HttpClientиз JDK и уRestTemplateпо умолчанию нет таймаута на ответ, поток может висеть бесконечно; - повторы: только для идемпотентных операций, с экспоненциальной задержкой. Для создающих запросов передавайте
Idempotency-Key, иначе повтор после таймаута создаст вторую операцию; - защита от падений партнёра: circuit breaker и bulkhead из Resilience4j, чтобы медленный сервис не занял все потоки;
- неизвестный результат: если таймаут случился после отправки, операцию нельзя считать ни проведённой, ни отменённой. Нужен запрос статуса или сверка;
- изоляция модели: DTO чужого сервиса маппятся в свои доменные объекты на границе, это anti-corruption layer;
- безопасность: mTLS или OAuth2 client credentials через Spring Security;
- тесты: WireMock для ответов и отказов, Spring Cloud Contract или Pact для контракта, Testcontainers для Kafka;
- наблюдаемость: Micrometer, метрики времени ответа и ошибок по каждому вызову, проброс trace id.
Где спотыкаются
Сразу пишут код с HttpClient без единого уточнения. Интервьюер хотел услышать вопросы, а получил пример GET-запроса.
Ставят retry на все вызовы подряд. Повтор неидемпотентного POST в операционном сервисе означает двойное списание.
Оставляют таймауты по умолчанию. Один зависший партнёр съедает пул потоков, и падает весь сервис.