Статус CLI RabbitMQ отличается от портала управления

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

Вот вывод состояния 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 соединений, каждое с двумя каналами

фактическое количество подключений

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

Я заметил, что всякий раз, когда я запускаю или отключаю один из модулей, который подключается к брокеру, количество читателей/писателей увеличивается примерно на 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, но как только модули начинают повторно подключаться, числа начинают возвращаться.

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


person Josh Kitchens    schedule 30.01.2016    source источник


Ответы (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.

person tiredpixel    schedule 01.02.2016
comment
Это имеет массу смысла, теперь, когда я думаю об этом. Большое спасибо! - person Josh Kitchens; 01.02.2016