Всегда открыт публиковать канал RabbitMQ
Я пытаюсь интегрировать 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).
Есть ли способ сохранить постоянно открытый канал публикации, чтобы мне не приходилось открывать / создавать соединение с очередью?
1 ответ
Запрос о том, можете ли вы разговаривать с сервером RabbitMQ, не подключаясь к нему первым, это все равно, что спрашивать, можете ли вы поговорить с кем-то по телефону, не подключившись к его телефону вначале (набрав номер и ответив).
Вы действительно должны повторно использовать ваше соединение, если вы собираетесь отправлять несколько сообщений, но сначала вам нужно соединение!
В любом случае, проблема не в издателе. Это потребитель глючит, если теряет сообщения.