Когда происходит синхронный блокирующий вызов в микросервисной архитектуре, процесс отправляет вызов другому процессу и блокируется, ожидая завершения вызова и получения ответа. Ваш вопрос касается уточнения, блокируется ли весь микросервис или только поток, из которого был сделан вызов. Предположим, у вас есть два микросервиса A и B, каждый с одним экземпляром, созданным на Spring Web или другом веб-фреймворке. Когда пользователь делает запрос, поток в микросервисе A обрабатывает этот запрос, создавая новый поток (или используя поток из пула) для его обслуживания. Затем микросервис A делает синхронный блокирующий вызов микросервису B, блокируя поток, который обслуживает этот конкретный запрос. Таким образом, другие пользователи могут быть обслужены в отдельных потоках и микросервис A не блокируется целиком, продолжая работать нормально. Теперь вопрос: почему же в книге указано, что блокируется микросервис?
Возможно, в книге имеется в виду, что синхронный вызов может блокировать доступ к микросервису для других запросов или клиентов. В отличие от асинхронного вызова, где процесс отправляет запрос и не ожидает ответа, синхронный вызов блокирует выполняющий поток до получения ответа от другого микросервиса. Это означает, что пока первый микросервис ждет ответа, он не может обрабатывать другие запросы, поэтому доступ к нему может быть временно заблокирован. Таким образом, синхронные вызовы могут снижать производительность и масштабируемость системы. Для избежания блокировки микросервиса можно применить асинхронные вызовы или использовать пул потоков для многопоточной обработки запросов. Таким образом, микросервис может продолжать обработку других запросов, пока ожидает ответа от другого микросервиса.
блокируется микросервис (мс) вообще целиком или все-таки только поток, из которого сделан вызов?
Блокируется поток (т.к. коммуникация идет с гранулярностью в 1 поток).
Блокирующий вызов означает, что вызывающая сторона ОЖИДАЕТ ответа.
Это сравнивается с НЕБЛОКИРУЮЩИМИ запросами, например, запись в очередь.
Примеры блокирующих:
- HTTP
- gRPC
- отправляешь сообщение в одну очереди и начинаешь читать ответ из другой (это тоже блокирующий)
Примеры НЕблокирующих:
- Kafka, Rabbit
- Outbox (паттерн)
Так почему тогда в книге написано, что блокируется микросервис?
Значит, неправильно описал, не те слова подобрал