Какие методы синхронного взаимодействия существуют и когда они применяются
Что проверяют
Понимаете ли вы разницу между «вызвал и жду ответ» и «отправил сообщение и пошёл дальше», и главное, чем за синхронность платят. Вопрос почти всегда ведёт к отказоустойчивости: что происходит с цепочкой сервисов, когда последний в ней начинает отвечать медленно. Часто уточняют, делает ли async/await взаимодействие асинхронным.
Как отвечать
Перечислите механизмы по уровням:
- внутри процесса: обычный вызов метода, блокирующее чтение файла или сокета, ожидание на примитивах синхронизации (
lock,Monitor,SemaphoreSlimв C#); - между сервисами: HTTP и REST в модели запрос-ответ, gRPC unary, запрос GraphQL, SOAP. Клиент держит соединение и ждёт результат;
- внешние системы: SQL-запрос, вызов платёжного шлюза. Формально это тоже синхронное взаимодействие;
Дальше про выбор. Синхронно делают то, где ответ нужен прямо сейчас для продолжения сценария: авторизация, проверка баланса перед списанием, чтение справочника, запрос из интерфейса. Асинхронно через очередь (Kafka, RabbitMQ) уходит всё, что можно сделать потом: уведомления, отчёты, индексация, рассылки.
Обязательно назовите цену: время ответа складывается по всей цепочке, доступность перемножается, сбой одного сервиса поднимается вверх. Отсюда обязательный набор: таймаут на каждый вызов, повторы с разбросом задержки и только для идемпотентных операций, ключ идемпотентности, размыкатель цепи (Polly в .NET, Resilience4j в Java), изоляция пулов соединений и разумный запасной ответ.
Для QA добавьте проверки: контрактные тесты, подмена внешней системы через WireMock или Testcontainers, сценарии на таймаут и медленный ответ.
Где спотыкаются
Считают, что async/await превращает вызов в асинхронное взаимодействие. Он освобождает поток, но вызывающая сторона всё равно ждёт ответа, и связность между сервисами никуда не девается.
Строят цепочку из пяти синхронных вызовов и удивляются каскадному отказу. Одна медленная зависимость выедает пулы соединений во всех сервисах выше по цепочке.
Ставят повторы на неидемпотентную операцию, и клиент получает три одинаковых списания. Либо, наоборот, не ставят таймаут вовсе, и запрос висит до таймаута сокета в несколько минут.