Python 始终打开发布通道RabbitMQ

Python 始终打开发布通道RabbitMQ,python,performance,perl,rabbitmq,snmptrapd,Python,Performance,Perl,Rabbitmq,Snmptrapd,我正在尝试集成snmptrapd和RabbitMQ,以便将陷阱通知传递到外部系统 我的系统由3个组件组成: 具有snmptrapd和RabbitMQ(发布者)的Linux虚拟机 具有RabbitMQ(使用者)的Linux虚拟机 有docker的Linux裸机,因此我可以有很多容器发送陷阱(使用nping) snmptrapd部分很简单: authCommunity execute mycom traphandle default /root/some_script 在我的第一次尝试中,so

我正在尝试集成snmptrapd和RabbitMQ,以便将陷阱通知传递到外部系统

我的系统由3个组件组成:

  • 具有snmptrapd和RabbitMQ(发布者)的Linux虚拟机
  • 具有RabbitMQ(使用者)的Linux虚拟机
  • 有docker的Linux裸机,因此我可以有很多容器发送陷阱(使用nping)
snmptrapd部分很简单:

authCommunity execute mycom
traphandle default /root/some_script
在我的第一次尝试中,
some_脚本
是用Python编写的,但性能并不完美(20个容器在10秒内每秒发送1个陷阱,我在consumer中只收到160条消息)

我切换到Perl,现在我可以得到200个陷阱/消息

我的Perl脚本使用

#/usr/bin/perl
使用Net::AMQP::RabbitMQ;
foreach我的$line(){
chomp($line);
$message=“$message\n$line”;
}
我的$mq=Net::AMQP::RabbitMQ->new();
$mq->connect(“我的ip”{
用户=>“测试”,
密码=>“测试”,
vhost=>“/”
});
$mq->channel_open(1);
$mq->publish(1,“snmp”,$message);
$mq->disconnect();
但我想要更好的。我试着用200个容器每秒发送1个陷阱,结果失败得很惨,在消费者中只接收到大约10%的消息

#!/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()
我认为这与每次接收陷阱都必须在RabbitMQ中打开、发布和关闭通道的开销有关,因为在网络级别,我接收所有消息(通过tcpdump检查)


有没有办法保持一个始终打开的发布频道,这样我就不必重新打开/创建到队列的连接?

询问您是否可以在不首先连接RabbitMQ服务器的情况下与该服务器通话,就像询问您是否可以在不首先连接其电话的情况下与某人通话一样(通过拨号和接听)

如果你要发送多条消息,你真的应该重用你的连接,但是你确实需要先建立一个连接


无论如何,问题不在于出版商。如果消费者丢失了信息,那么他们就有麻烦了。

嗨,ikegami,我在问我怎么才能保证频道始终开放。我不想在封闭的频道上发送消息。别把我当傻瓜看待。不,问题出在出版商身上。我在出版商上发送的所有消息都到达了消费者身上。包含发布服务器的计算机难以发送所有消息,这不是资源问题,因为没有任何进程会消耗所有CPU/内存。通道只是随每条消息一起发送的数字。如果基本发布失败,则会出现异常。问题不在发布者身上。正如您所说的“在网络级别,我接收所有消息”。
#!/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();