2016-12-28 2 views
1

Я создаю систему анализа с миллионом пользователей онлайн в одно и то же время. Я использую RabbitMQ, такие как сообщение брокеру, чтобы уменьшить емкость для сервераВысокая производительность на сервере Nodejs RabbitMQ

Вот моя схема

enter image description here

Моя система включает 3 компонента.

Издательский сервер: (Производитель) Эта система была построена на nodejs. Цель этой системы публиковать сообщения в queue

очереди RabbitMQ: Эта система хранятся сообщения, отправленные publisher server. После этого открывается одно соединение для отправки сообщения из очереди для subscriber server.

подписчика сервер (Consumer): Эта система принимает сообщения от queue

Публикация исходного сервера код

var amqp = require('amqplib/callback_api'); 
amqp.connect("amqp://localhost", function(error, connect) { 
    if (error) { 
     return callback(-1, null); 
    } else { 
     connect.createChannel(function(error, channel) { 
     if (error) { 
      return callback(-3, null); 
     } else { 
     var q = 'logs'; 
     var msg = data; // object 
     // convert msg object to buffer 
     var new_msg = Buffer.from(JSON.stringify(msg), 'binary'); 

     channel.assertExchange(q, 'fanout', { durable: false }); 
     channel.publish(q, 'message_queues', new Buffer(new_msg)); 
     console.log(" [x] Sent %s", new_msg); 
     return callback(null, msg); 
     } 
    }); 
    } 
}); 

создают исключительно обмен "message_queues" с "fanout" отправить вещание на все потребитель

сервер подписчика исходный код

var amqp = require('amqplib/callback_api'); 
amqp.connect("amqp://localhost", function(error, connect) { 
    if (error) { 
     console.log('111'); 
    } else { 
     connect.createChannel(function(error, channel) { 
      if (error) { 
       console.log('1'); 
      } else { 
       var ex = 'logs'; 

       channel.assertExchange(ex, 'fanout', { durable: false }); 
       channel.assertQueue('message_queues', { exclusive: true }, function(err, q) { 
        if (err) { 
         console.log('123'); 
        } else { 
         console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q.queue); 
         channel.bindQueue(q.queue, ex, 'message_queues'); 

         channel.consume(q.queue, function(msg) { 
          console.log(" [x] %s", msg.content.toString()); 

         }, { noAck: true }); 

        } 
       }); 
      } 
     }); 
    } 

}); 

получить messge от "message_queues" обмена

Когда я реализую отправить сообщение. Система работает хорошо, однако я попытался проверить производительность теста этой системы (с ~ 1000 пользователей, отправленных в секунду), тогда система имеет некоторые проблемы. Система выглядит как перегрузка/переполнение буфера (или что-то не работает).

Я только что читал про rabbitmq 2 дня назад. Я знаю, что его учебники является основным примером, так что мне нужна помощь, чтобы построить системы в реальном мире, чем .. Любого решения & предложение

Надежда, что мой вопрос сделать чувство

ответ

2

Вашего вопроса вообще. Вероятно, вы должны предоставить более подробную информацию, чтобы помочь определить узкое место и помочь вам. Итак, прежде всего, я думаю, вы должны проверить кролик mq - будь то узкое место или нет. Есть много вещей, которые могут пойти не так:

  1. Количество потребителей, которые могут потреблять сообщение слишком низкий (я предполагаю, что вы используете пул потребителей)

  2. сети слишком медленно

  3. очереди и сообщения реплицируются между слишком большим количеством узлов Rabbit MQ и пойти сделать диск (его можно использовать кролик мэк, как это)

  4. потребитель не может действительно HANDL e сообщение, и оно постоянно переупорядочено

Итак, в целом во время испытаний вы должны проверить кролик mq и посмотреть, что там происходит.

сообщение сразу поступает в очередь в Готово государства, как только это произойдет, он будет там до один из потребителей, подключенных к очереди не будет пытаться принять сообщение для обработки

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

Конечно, если потребитель успешно обрабатывает сообщение, сообщение исчезает с сервера mk кролика.

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

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

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

+0

Я попытался включить инструмент управления веб-ui, но я не могу снова подключить сервер кролика mq, похоже, что он изменил конфигурацию или порт для подключения к серверу кролика на моей машине. Поэтому я снова установил кролик mq. Вы помогаете мне в этой душевности? – Loint

+1

плагин управления ui работает на другом порту. Порт по умолчанию - 15672. Чтобы включить этот плагин, вы должны ssh на сервер mpb mq и введите: * rabbitmq-plugins enable rabbitmq_management * –

+0

Я могу запустить web ui, но я не могу подключить кролика из исходного кода (не любое изменение) 'amqp.connect (" amqp: // localhost ", fuction());' – Loint

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