Всегда открыт публиковать канал 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, не подключаясь к нему первым, это все равно, что спрашивать, можете ли вы поговорить с кем-то по телефону, не подключившись к его телефону вначале (набрав номер и ответив).

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

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

Другие вопросы по тегам