Понимание, замена, настройка и изменение пулов потоков Spring Rabbit (AMQP): список вопросов - PullRequest
1 голос
/ 02 апреля 2020

У меня есть несколько коротких вопросов о RabbitMQ + Spring, и я буду признателен за вашу помощь по этому вопросу.

После прочтения документации здесь (https://docs.spring.io/spring-amqp/reference/html/#connections) и здесь (https://www.rabbitmq.com/api-guide.html) Кажется, API для клиента Java + Spring имеет класс CachingConnectionFactory .

Факты:

  1. CachingConnectionFactory имеет два члена интереса: PublisherConnectionFactory и RabbitConnectionFactory

  2. CachingConnectionFactory расширяет родительский класс с именем AbstractConnectionFactory

  3. CachingConnectionFactory имеет член с именем (ExecutorService channelExecutor ).

  4. AbstractConnectionFactory имеет член с именем (ExecutorService executorService ).

  5. AbstractConnectionFactory имеет метод с именем setExecutor (ExecutorService executorService ), который устанавливает собственный executorService и затем вызывает тот же метод для его PublisherConnectionFactory

  6. RabbitConnectionFactory имеет 4 (!) различных исполнителей: sharedExecutor , shutdownExecutor , heartbeatExecutor , topologyRecoveryExecutor ; Он также имеет член с именем nioParams , с другими 2 исполнителями: nioExecutor и connectionShutdownExecutor . Кроме того, у него есть метод с именем params , который принимает другого исполнителя с именем consumerWorkServiceExecutor . То есть 7 исполнителей всего (!!)

  7. Кажется, RabbitConnectionFactory , и документы здесь (https://www.rabbitmq.com/api-guide.html еще раз), при создании канала можно указать любого другого исполнителя: rabbitConnectionFactory. newConnection (myExecutorService);

Вопросы:

  1. В чем разница и взаимосвязь между CachingConnectionFactory , PublisherConnectionFactory и RabbitConnectionFactory ?

  2. Зачем нам так много разных пулов исполнителей? В чем разница между ними всеми?

  3. Эти классы совместно используют свои пулы / исполнители потоков?

  4. Когда соединение открыто, для какого пула потоков оно выделено?

  5. Когда канал открыт, для какого пула потоков он выделен?

  6. Используют ли операции publi sh и потребления различные пулы потоков?

  7. Как передать в моем собственном исполнении исполнителя или как-то иначе настроить каждого из вышеупомянутых исполнителей?

  8. Было бы хорошей идеей объединить / объединить некоторых или всех исполнителей?

Заранее спасибо

1 Ответ

1 голос
/ 02 апреля 2020

Я только что ответил вам в rabbitmq-users Группе Google.

Я могу ответить на вопросы о Spring.

В чем разница и связь между CachingConnectionFactory и PublisherConnectionFactory и RabbitConnectionFactory?

CCF является основным заводом; по умолчанию. его единственное соединение является общим для всех компонентов (но у него есть режим кэширования, поддерживающий несколько соединений). PCF - это необязательный CCF, который можно использовать для публикации (когда RabbitTemplate.usePublisherConnection имеет значение true). Рекомендуется разрешить потребителям продолжать потреблять, когда издатели заблокированы.

CCF executorService (если имеется) передается в RCF.newConnection (). ChannelExecutor является внутренним исполнителем, который используется, только если издатель подтверждает, что включены; он используется для отсрочки запроса на закрытие канала до получения подтверждения издателя (или тайм-аута).

Зачем нам нужно так много разных пулов исполнителей? В чем разница между ними всеми? Разделяют ли эти классы свои пулы потоков / исполнители?

CCF executorService (если присутствует) передается в RCF.newConnection().

Когда соединение открыто, к которому выделен ли пул потоков?

CCF executorService (если имеется) передается в RCF.newConnection(). В противном случае amqp-клиент использует своего собственного исполнителя.

Когда канал открыт, для какого пула потоков он выделен? Используют ли операции Publi sh и потребления разные пулы потоков?

Если RabbitTemplate.usePublisherConnection имеет значение true, а PCF имеет другого исполнителя.

Как передать в моя собственная реализация исполнителя или другая конфигурация, каждый из упомянутых исполнителей?

Существуют методы установки для двух исполнителей CCF. Если вы хотите, чтобы в PCF был другой исполнитель, используйте CCF.getPublisherConnectionFactory() и вызовите его установщик.

Было бы хорошей идеей объединить / объединить некоторых или всех исполнителей?

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