Я пытаюсь интегрировать snmptrapd и RabbitMQ для доставки уведомлений о ловушках во внешнюю систему.
Моя система состоит из 3 компонентов:
- Виртуальная машина Linux с 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).
Есть ли способ сохранить всегда открытый канал публикации, чтобы мне не приходилось повторно открывать/создавать соединение с очередью?