2016-01-30 5 views
0

Я заметил, что когда я запускаю команду статуса RabbitMQ из командной строки (rabbitmqctl status), все сообщенные номера являются выходцами из того, что я знаю как реальность. Моя реальность подтверждается тем, что я вижу на веб-портале управления.RabbitMQ CLI статус отличается от порта управления управления

Вот выход из состояния CLI:

[{pid,26647}, 
{running_applications, 
    [{rabbitmq_management,"RabbitMQ Management Console","3.5.4"}, 
     {rabbitmq_web_dispatch,"RabbitMQ Web Dispatcher","3.5.4"}, 
     {webmachine,"webmachine","1.10.3-rmq3.5.4-gite9359c7"}, 
     {mochiweb,"MochiMedia Web Server","2.7.0-rmq3.5.4-git680dba8"}, 
     {rabbitmq_management_agent,"RabbitMQ Management Agent","3.5.4"}, 
     {rabbit,"RabbitMQ","3.5.4"}, 
     {os_mon,"CPO CXC 138 46","2.3"}, 
     {inets,"INETS CXC 138 49","5.10.4"}, 
     {mnesia,"MNESIA CXC 138 12","4.12.4"}, 
     {amqp_client,"RabbitMQ AMQP Client","3.5.4"}, 
     {xmerl,"XML parser","1.3.7"}, 
     {sasl,"SASL CXC 138 11","2.4.1"}, 
     {stdlib,"ERTS CXC 138 10","2.3"}, 
     {kernel,"ERTS CXC 138 10","3.1"}]}, 
{os,{unix,linux}}, 
{erlang_version, 
    "Erlang/OTP 17 [erts-6.3] [source] [64-bit] [smp:4:4] [async-threads:64] [kernel-poll:true]\n"}, 
{memory, 
    [{total,45994136}, 
     {connection_readers,101856}, 
     {connection_writers,54800}, 
     {connection_channels,165968}, 
     {connection_other,373008}, 
     {queue_procs,175376}, 
     {queue_slave_procs,0}, 
     {plugins,437024}, 
     {other_proc,13385792}, 
     {mnesia,131904}, 
     {mgmt_db,484216}, 
     {msg_index,53112}, 
     {other_ets,1119384}, 
     {binary,3890640}, 
     {code,20097289}, 
     {atom,711569}, 
     {other_system,4812198}]}, 
{alarms,[]}, 
{listeners,[{clustering,25672,"::"},{amqp,5672,"::"}]}, 
{vm_memory_high_watermark,0.4}, 
{vm_memory_limit,787190579}, 
{disk_free_limit,50000000}, 
{disk_free,778919936}, 
{file_descriptors, 
    [{total_limit,924}, 
     {total_used,13}, 
     {sockets_limit,829}, 
     {sockets_used,11}]}, 
{processes,[{limit,1048576},{used,350}]}, 
{run_queue,0}, 
{uptime,911}] 

Количество читателей, писателей, каналов и т.д., в основном каждое число умножается множественным тысяч раз.

Номера указаны на портале управления (см. Ниже). 10 все соединения, каждое с двумя каналами

actual number of connections

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

Я заметил, что всякий раз, когда я разворачиваю вверх или вниз по одному из модулей, которые соединяются с брокером, количество читателей/писателей увеличивается на ~ 17 000 в командной строке, несмотря на то, что только вверх/вниз 1 на портале ,

Вот мой код конфигурации брокера для справки:

private String endPoint; 
private int port; 
private String userName; 
private String password; 
private Exchange publisherExchange; 
private ExchangeType publisherExchangeType; 
private Map<Exchange, ExchangeType> subscriptionExchanges; 

private Channel publishChannel; 
private Channel subscriptionChannel; 
private Consumer consumer; 

private BrokerHandler(BrokerHandlerBuilder builder) throws ConnectException{ 
    this.endPoint = builder.endPoint; 
    this.port = builder.port; 
    this.userName = builder.userName; 
    this.password = builder.password; 
    this.publisherExchange = builder.publisherExchange; 
    this.publisherExchangeType = builder.publisherExchangeType; 
    this.subscriptionExchanges = builder.subscriptionExchanges; 

    connect(); 
} 

private void connect() throws ConnectException{ 
    ConnectionFactory factory = new ConnectionFactory(); 

    factory.setHost(this.endPoint); 
    factory.setPort(this.port); 

    if(this.userName != null && this.password != null){ 
     factory.setUsername(this.userName); 
     factory.setPassword(this.password); 

     factory.setAutomaticRecoveryEnabled(true); 
     factory.setNetworkRecoveryInterval(RMQConstants.RABBITMQ_MAX_RETRY_DELAY); 

    } 

    try { 
     log.info("Registering with broker on topic " + this.publisherExchange.toString() + " on " + this.endPoint + "..."); 
     connection = factory.newConnection(); 
     publishChannel = connection.createChannel(); 
     subscriptionChannel = connection.createChannel(); 
     configureConsumer(); 

     publishChannel.exchangeDeclare(this.publisherExchange.toString(), this.publisherExchangeType.toString()); 

    } catch(Exception e){ 
     throw new ConnectException("Unable to connect to RabbitMQ broker."); 
    } 

    if(this.subscriptionExchanges.size() > 0){ 
     subscribe(this.subscriptionExchanges); 
    } 
} 
/** 
* Allows callers to publish a message to the broker, which will be broadcast to all listeners using a FANOUT strategy 
* @throws ConnectException if the handler is not connected to the broker 
*/ 
private void publishToBroker(String msg) throws ConnectException{ 
    try { 
     publishChannel.basicPublish(this.publisherExchange.toString(), "", null, msg.getBytes()); 
    } 
    catch (IOException e) { 
     log.error("Unable to write message to broker.", e); 
    } 
} 

private void subscribe(Map<Exchange, ExchangeType> exchanges){ 
    try { 
     String queueName = subscriptionChannel.queueDeclare().getQueue(); 

     exchanges.forEach((k,v) -> { 
      try { 
       subscriptionChannel.exchangeDeclare(k.toString(), v.toString()); 
       subscriptionChannel.queueBind(queueName, k.toString(), ""); 
      } catch (Exception e) { 
       log.error("Error declaring exchanges for exchange: " + k.toString(), e); 
      } 
     }); 

     subscriptionChannel.basicConsume(queueName, true, consumer);  
    } 
    catch(Exception e){ 
     log.error("Error declaring a queue for subscription channel", e); 
    } 
} 

private void configureConsumer(){ 
    consumer = new DefaultConsumer(subscriptionChannel) { 
      @Override 
      public void handleDelivery(String consumerTag, Envelope envelope, 
            AMQP.BasicProperties properties, byte[] body) throws IOException { 
      String message = new String(body, "UTF-8"); 
      handleMessage(message); 
      } 
     }; 
} 

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

Сообщения публикуются и принимаются должным образом, но я получаю отчеты о том, что брокер заботится о серверах. Я буду следить за ним более внимательно, но мне бы очень хотелось, чтобы я мог объяснить эти нелепые результаты из вызова статуса. Я попытался остановить приложение и сбросить его, а затем переконфигурировать брокера, который возвращает количество подключений обратно в 0, но после того, как модули начнут повторное подключение номеров, начнется возврат.

Спасибо, что нашли время, чтобы просмотреть это. Любой совет будет очень благодарен!

ответ

1

connection_readers, connection_writers, connection_channels и т.д., которые вы сообщаете в разделе memory, и блоки байтов, а не число соединений. Это разные данные целиком в разделе пользовательского интерфейса управления, о котором вы сообщаете.

Чтобы получить данные через CLI о количестве подключений, используйте команду rabbitmqctl list_connections.

channels 
    Number of channels using the connection. 

Смотрите также list_exchanges, list_queues и list_consumers.

+0

Это тонна смысла, теперь, когда я думаю об этом. Большое спасибо! –

+0

@ JoshKitchens: Вы очень желанны. :) – tiredpixel