Я создаю REST api для отправки сообщения RabbitMQ и пытался понять, что лучше всего подходит для создания/закрытия каналов. Я использую RabbitMQ Java client api.RabbitMQ канал наилучшей практики
В настоящее время у меня есть класс RabbitMQPublisherConnection
, где я использую пружинное соединение RabbitMQ. Затем этот класс вводится весной в другой класс RabbitMQPublisherChannel
. Этот класс имеет следующую функцию, чтобы создать канал:
public class RabbitMQPublisherChannel { public Channel createChannel(String amqpExchange, String exchangeType, String queue, String routingKey, boolean durableExchange, boolean durableQueue, boolean autoDelete, com.rabbitmq.client.Connection connection) throws IOException { Channel channel = null; channel = connection.createChannel(); if ((amqpExchange != null) && !"".equals(amqpExchange.trim())) { if (log.isLoggable(Level.FINEST)) { log.finest("exchange:" + amqpExchange + ", type: " + exchangeType + ", durableExchange: " + durableExchange); } channel.exchangeDeclare(amqpExchange, exchangeType, durableExchange); channel.queueDeclare(queue, durableQueue, false, autoDelete, null); channel.queueBind(queue, amqpExchange, routingKey); } return channel; } }
Теперь у меня есть третий класс RabbitMQPublisher
где я весна впрыснуть RabbitMQPublisherChannel
класс. Мой контекст приложения выглядит следующим образом:
<bean id="rabbitMQPublisher" class="com.rabbitmq.RabbitMQPublisher">
<property name="publisherChannel" ref="rabbitMQPublisherChannel"/>
</bean>
<bean id="rabbitMQPublisherChannel" class="com.rabbitmq.RabbitMQPublisherChannel">
<property name="publisherConnection" ref="rabbitMQPublisherConnection"/>
</bean>
<bean id="rabbitMQPublisherConnection" class="com.rabbitmq.RabbitMQPublisherConnection">
<property name="rabbitMQConnectionSettingMap">
.. connection ..
</property>
</bean>
Класс RabbitMQPublisher
имеет функцию опубликовать сообщение для RabbitMQ:
public boolean publishMessage(String message, String queueName){
try {
// Validate queue name
com.rabbitmq.client.Channel channel = publisherChannel.getRabbitMQChannel(queueName);
RabbitMQConnection settings = publisherChannel.getPublisherConnection().getRabbitMQConnectionSettingMap().get(queueName);
if (channel != null) {
channel.basicPublish(settings.getAmqpExchange(), settings.getAmqpRoutingKey(), null, message.getBytes());
publisherChannel.closeChannel(channel);
}
} catch (AlreadyClosedException e) {
return FAILURE_RESPONSE;
} catch (IOException e) {
return FAILURE_RESPONSE;
}
return SUCCESS_RESPONSE;
}
Это приложение запускается через кот, и я заметил, с AppDynamics, что закрытие канала занимает 47% от общего времени, затраченного на публикацию сообщения. Когда я удаляю вызов, чтобы закрыть канал, я сохраняю это 47% времени, которое составляет 32 мс, но затем я замечаю в своей консоли управления RabbitMQ, что количество каналов увеличивается для этого соединения.
Так что мои вопросы -
- Это хорошая практика, чтобы открыть & близкий канал после того, как каждый публиковать предполагая, что кот получит несколько запросов в секунду?
- Является ли это хорошей практикой иметь пул каналов, разделяемый между несколькими потоками (который RabbitMQ recommends, но также говорит
Even so, applications should prefer using a Channel per thread instead of sharing the same Channel across multiple threads.
) Означает ли это создание нового канала для каждого потока? - Будет хорошей практикой не закрывать канал и через каналы очистки RabbitMQ http api, которые простаивают. (Пожалуйста, не рекомендую это)?
- Стоит ли экономить 32 мс?
Благодаря
Спасибо @Gary! Я использовал 'spring-amqp', и он был очень прост в использовании. Это очень хорошо структурировано. У меня просто мало вопросов - насколько велико сообщество, использующее/способствующее этому? И сколько людей уже используют его в производстве? Я очень новичок в этом, поэтому был обеспокоен, если я получу достаточную помощь, если я поеду вживую, и есть проблема, которую я не могу понять. – Sumitk
Добро пожаловать! Проект более 5 лет и активно поддерживается как [вы можете видеть на github] (https://github.com/spring-projects/spring-amqp/graphs/contributors). Мы сами и Артем Билан являются главными вкладчиками в наши дни (мы работаем Pivotal, как и большинство основных участников Spring Framework). Поэтому Spring AMQP является первоклассным гражданином в весенней экосистеме и является избранной библиотекой для пользователей Spring. Мы периодически получаем запросы от сообщества (все приветствуются!). Вы обнаружите, что Артем и я очень отзывчивы. Команда rabbitmq также работает для Pivotal. –
Спасибо за информацию Гэри!Да, весна-amqp выглядит очень аккуратно, и я думаю использовать ее сейчас. У вас есть IRC, где я могу опубликовать несколько простых вопросов, или Stackoverflow - единственный лучший способ для этого? Также есть ли какие-либо рекомендации по развертыванию производства? Спасибо – Sumitk