Python 始终打开发布通道RabbitMQ
我正在尝试集成snmptrapd和RabbitMQ,以便将陷阱通知传递到外部系统 我的系统由3个组件组成: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(发布者)的Linux虚拟机李>
- 具有RabbitMQ(使用者)的Linux虚拟机李>
- 有docker的Linux裸机,因此我可以有很多容器发送陷阱(使用nping)
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();