SimpleMessageListener против DirectMessageListener - PullRequest
1 голос
/ 01 ноября 2019

Я пытаюсь увидеть разницу между DirectMessageListener и SimpleMessageListener. У меня есть этот рисунок, чтобы спросить, является ли он правильным.

Позвольте мне попытаться описать, как я его понял, и, возможно, вы скажете мне, если он правильный.

Перед spring-rabbit находится java-библиотека rabbit-client, которая подключается к серверу rabbit-mq и доставляет сообщения в библиотеку spring-rabbit. У этого клиента есть ThreadPoolExecutor (что в данном случае, я думаю, - 16 потоков). Таким образом, не имеет значения, сколько очередей в кролике - если есть одно соединение, я получаю 16 потоков. Эти же потоки используются повторно, если я использую DirectMessageListener - и этот метод-обработчик listen выполняется во всех этих 16 потоках, когда приходят сообщения. Поэтому, если я делаю что-то сложное в обработчике, rabbit-client должен дождаться освобождения потока, чтобы получить следующее сообщение, использующее этот поток. Также, если я увеличу setConsumersPerQueue до 20, скажем, это создаст 20 потребителей на очередь, но не потоков. Эти 20 * 5 потребителей в моем случае все будут повторно использовать эти 16 потоков, предлагаемые ThreadPoolExecutor?

SimpleMessageListener, с другой стороны, будут иметь свои собственные потоки. Если одновременных потребителей == 1 (я думаю, по умолчанию, как в моем случае), он имеет только один поток. Всякий раз, когда есть сообщение в любой из secondUseCase* очередей, java-библиотека rabbit-client будет использовать в моем случае один из 16 потоков для пересылки сообщения в один внутренний поток, который у меня есть в SimpleMessageListener. Как только он пересылается, поток библиотеки java rabbit-client освобождается, и он может вернуться к получению большего количества сообщений с кроличьего сервера.

enter image description here

1 Ответ

1 голос
/ 05 ноября 2019

Ваше понимание верно.

Основное отличие состоит в том, что с помощью DMLC все слушатели во всех контейнерах слушателей вызываются в пуле общих потоков в amqp-клиенте (при необходимости вы можете увеличить 16). ). Вы должны убедиться, что пул достаточно большой для обработки ожидаемого параллелизма во всех контейнерах, в противном случае вы получите голод.

Это более эффективно, поскольку потоки являются общими.

С SMLC вы не работаетеНе нужно беспокоиться об этом, но за счет наличия потока на параллелизм. В этом случае небольшого пула в amqp-client будет достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...