Увеличьте пропускную способность с помощью RabbitMQ
В нашем проекте мы хотим использовать RabbitMQ в шаблоне "Очереди задач" для передачи данных.
На стороне производителя мы создаем несколько TCP-серверов (в node.js) для recv
высокие параллельные данные и отправить его в MQ без каких-либо действий.
На стороне потребителя мы используем JAVA-клиент для получения данных задачи из
MQ, обработайте его, а затем ack.
Итак, вопрос:
Чтобы получить максимальную пропускную способность/производительность передачи сообщений (например, 400 000 мс/с), Сколько очередей лучше? Чем больше очередей, тем лучше производительность/производительность? И есть ли что-нибудь еще, что я должен заметить?
Любые известные рекомендации по использованию RabbitMQ в таком сценарии?
Любые комментарии очень ценятся!
Ответы
Ответ 1
Для лучшей производительности в RabbitMQ следуйте советам своих создателей. Из блога RabbitMQ:
Очереди RabbitMQ быстрее, когда они пусты.. Когда очередь пустой, и у него есть потребители, готовые получать сообщения, а затем, как только сообщение принимается очередью, оно идет прямо к потребитель. В случае постоянного сообщения в надежной очереди да, он также перейдет на диск, но это будет сделано асинхронно и буферизуется в значительной степени. Главное, что очень мало бухгалтерского учета необходимо сделать очень мало структур данных, и очень требуется небольшая дополнительная память.
Если вы действительно хотите углубиться в производительность очередей RabbitMQ, эта другая запись в блоге их значительно больше входит в данные.
Ответ 2
В соответствии с ответом, который я получил от группы рассылки rabbitmq-discuss, есть другие вещи, которые вы можете попытаться увеличить пропускную способность и уменьшить задержку:
-
Используйте большой счет предварительной выборки. Небольшие значения ухудшают производительность.
-
Обмен темой происходит медленнее, чем прямой обмен или обмен фанатов.
-
Убедитесь, что очереди остаются короткими. Более длинные очереди налагают больше обработки накладные расходы.
-
Если вам нужны латентность и скорость сообщений, используйте более мелкие сообщения. Используйте эффективный формат (например, избегайте XML) или сжимайте полезную нагрузку.
-
Экспериментируйте с HiPE, что помогает производительности.
-
Избегайте транзакций и настойчивости. Также избегайте публикации в ближайшее время. или обязательный режим. Избегайте HA. Кластеризация также может влиять на производительность.
-
Вы получите лучшую пропускную способность в многоядерной системе, если у вас есть несколько очередей и потребителей.
-
Используйте как минимум v2.8.1, который вводит управление потоком. Убедитесь, что память и дисковое пространство никогда не запускаются.
-
Виртуализация может наложить небольшое ограничение производительности.
-
Настройте свою ОС и сетевой стек. Удостоверьтесь, что вы обеспечиваете более чем достаточно ОЗУ. Обеспечьте быстрые ядра и оперативную память.
Ответ 3
Вы увеличите пропускную способность с большим количеством предварительных выборок и в то же время ACK несколько сообщений (вместо отправки ACK для каждого сообщения) от вашего потребителя.
Но, конечно, ACK с несколькими флагами (http://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.ack) требует дополнительной логики для вашего потребительского приложения (http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2013-August/029600.html). Вам нужно будет хранить список тегов доставки сообщений, переданных от брокера, их статус (независимо от того, обрабатывало ли ваше приложение их или нет) и ACK каждый N-й тег доставки (NDTAG), когда все сообщения с доставкой -tag меньше или равно NDTAG.