Синхронный код в асинхронном @RabbitListener? - PullRequest
0 голосов
/ 21 января 2019

Из документов RabbitMQ сообщение принимается асинхронно с использованием @RabbitListener конечной точки:

"The easiest way to receive a message asynchronously is to use the annotated listener endpoint infrastructure. In a nutshell, it allows you to expose a method of a managed bean as a Rabbit listener endpoint."

@RabbitListener(queues = "myQueue")
public void processOrder(String data) {
    ...
}

Что именно здесь означает получение асинхронно? Каков эффект использования блокировки звонков, например, синхронный HTTP внутри функции processOrder(...), приведенной выше, с учетом определения receiving asynchronously?

1 Ответ

0 голосов
/ 21 января 2019

означает здесь асинхронно, что вы не вызываете этот метод напрямую, вместо этого некоторые фоновые службы будут вызывать его в какой-то момент времени, который не контролируется вами. В каком потоке будет вызван этот метод, зависит от конфигурации этого сервиса. Обычно такие службы используют пул потоков.

Эффект использования блокирующих вызовов внутри асинхронных методов заключается в том, что поток, в котором выполняется метод, блокируется и не может обслуживать другие асинхронные вызовы. Если пул потоков за асинхронной службой имеет ограниченное количество потоков, то может произойти так называемое «истощение потоков» и новые асинхронные вызовы не могут быть обработаны. В противном случае, если пул потоков неограничен, он может использовать всю доступную память, поскольку каждому потоку требуется 0,5-1 МБ для его стека вызовов. Чтобы избежать таких негативных последствий, асинхронная служба должна быть построена с пропускной способностью, достаточно высокой, чтобы выдерживать ожидаемую нагрузку, и в случае большой нагрузки следует принять меры предосторожности, чтобы служба изящно деградировала и не вызывала сбой всей JVM с OOM.

...