2016-12-29 3 views
0

Я пытаюсь интегрировать snmptrapd и RabbitMQ для доставки уведомлений ловушек во внешнюю систему.Всегда открывать канал публикации RabbitMQ

Моя система состоит из 3-х компонентов:

  • Линукс виртуальной машины с snmptrapd и RabbitMQ (Publisher);
  • Виртуальная машина Linux с RabbitMQ (Consumer);
  • Linux-голый металл с грузчиком, так что я могу иметь много контейнеров отправки ловушек (используя nping)

snmptrapd часть проста:

authCommunity execute mycom 
traphandle default /root/some_script 

В моих первых попытках some_script был написано в Python, но производительность не была идеальной (20 контейнеров, отправляющих 1 ловушку в секунду в течение 10 секунд, я получил только 160 сообщений у потребителя).

#!/usr/bin/env python 

import pika 
import sys 

message = "" 

for line in sys.stdin : 
     message += (line) 

credentials = pika.PlainCredentials('test', 'test') 

parameters = pika.ConnectionParameters('my_ip', 5672, '/', credentials) 

connection = pika.BlockingConnection(parameters) 
channel  = connection.channel() 

channel.queue_declare(queue='snmp') 

channel.basic_publish(exchange='', 
         routing_key='snmp', 
         body=message) 
connection.close() 

Я переключился на Perl и теперь могу получить 200 ловушек/сообщений.

Мой Perl скрипт использует Net::AMQP::RabbitMQ

#!/usr/bin/perl 

use Net::AMQP::RabbitMQ; 

foreach my $line (<STDIN>) { 
    chomp($line); 
    $message = "$message\n$line"; 
} 

my $mq = Net::AMQP::RabbitMQ->new(); 

$mq->connect("my_ip", { 
    user  => "test", 
    password => "test", 
    vhost => "/" 
}); 

$mq->channel_open(1); 
$mq->publish(1, "snmp", $message); 
$mq->disconnect(); 

Но я хочу лучше. Я попробовал 200 контейнеров, отправляющих 1 ловушку в секунду, и он потерпел неудачу, получая только около 10% сообщений у потребителя.

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

Есть ли способ сохранить всегда открытый канал публикации, поэтому мне не нужно снова открывать/создавать соединение с очередью?

ответ

0

Спрашивая, можете ли вы поговорить с сервером RabbitMQ, не подключаясь к нему, сначала спрашивают, можете ли вы поговорить с кем-то по телефону, не подключаясь сначала к своему телефону (набрав и отвечая).

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

В любом случае проблема не с издателем. Это потребитель, который не работает, если он теряет сообщения.

+0

Привет ikegami, я спрашиваю, как я могу поддерживать канал всегда открытым. Я не пытаюсь отправлять сообщения по закрытому каналу. Не обращайся со мной так, как будто я глуп. Нет, проблема в издателе. Все сообщения, которые я отправляю издателю, поступают на потребитель. Машина, которая содержит издателя, пытается отправить все сообщения, и это не проблема ресурсов, потому что ни один из процессов не потребляет весь процессор/память. –

+0

Канал - это просто номер, который отправляется с каждым сообщением. – ikegami

+0

Если basic_publish не работает, вы получите исключение. Проблема не в издателе. – ikegami