Я пытаюсь интегрировать 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).
Есть ли способ сохранить всегда открытый канал публикации, поэтому мне не нужно снова открывать/создавать соединение с очередью?
Привет ikegami, я спрашиваю, как я могу поддерживать канал всегда открытым. Я не пытаюсь отправлять сообщения по закрытому каналу. Не обращайся со мной так, как будто я глуп. Нет, проблема в издателе. Все сообщения, которые я отправляю издателю, поступают на потребитель. Машина, которая содержит издателя, пытается отправить все сообщения, и это не проблема ресурсов, потому что ни один из процессов не потребляет весь процессор/память. –
Канал - это просто номер, который отправляется с каждым сообщением. – ikegami
Если basic_publish не работает, вы получите исключение. Проблема не в издателе. – ikegami