2015-03-13 2 views
1

Я создаю 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, что количество каналов увеличивается для этого соединения.

Так что мои вопросы -

  1. Это хорошая практика, чтобы открыть & близкий канал после того, как каждый публиковать предполагая, что кот получит несколько запросов в секунду?
  2. Является ли это хорошей практикой иметь пул каналов, разделяемый между несколькими потоками (который RabbitMQ recommends, но также говорит Even so, applications should prefer using a Channel per thread instead of sharing the same Channel across multiple threads.) Означает ли это создание нового канала для каждого потока?
  3. Будет хорошей практикой не закрывать канал и через каналы очистки RabbitMQ http api, которые простаивают. (Пожалуйста, не рекомендую это)?
  4. Стоит ли экономить 32 мс?

Благодаря

ответ

2

Поскольку вы Framework пользователь Spring, рассмотреть вопрос об использовании Spring AMQP. RabbitTemplate использует кэшированные каналы по одному соединению с каналом, который проверяется из кеша (и возвращается) для каждой операции. Размер кеша по умолчанию - 1, поэтому его обычно нужно настроить для такой среды, как ваша.

+0

Спасибо @Gary! Я использовал 'spring-amqp', и он был очень прост в использовании. Это очень хорошо структурировано. У меня просто мало вопросов - насколько велико сообщество, использующее/способствующее этому? И сколько людей уже используют его в производстве? Я очень новичок в этом, поэтому был обеспокоен, если я получу достаточную помощь, если я поеду вживую, и есть проблема, которую я не могу понять. – Sumitk

+0

Добро пожаловать! Проект более 5 лет и активно поддерживается как [вы можете видеть на github] (https://github.com/spring-projects/spring-amqp/graphs/contributors). Мы сами и Артем Билан являются главными вкладчиками в наши дни (мы работаем Pivotal, как и большинство основных участников Spring Framework). Поэтому Spring AMQP является первоклассным гражданином в весенней экосистеме и является избранной библиотекой для пользователей Spring. Мы периодически получаем запросы от сообщества (все приветствуются!). Вы обнаружите, что Артем и я очень отзывчивы. Команда rabbitmq также работает для Pivotal. –

+0

Спасибо за информацию Гэри!Да, весна-amqp выглядит очень аккуратно, и я думаю использовать ее сейчас. У вас есть IRC, где я могу опубликовать несколько простых вопросов, или Stackoverflow - единственный лучший способ для этого? Также есть ли какие-либо рекомендации по развертыванию производства? Спасибо – Sumitk

Смежные вопросы