我正在尝试集成snmptrapd和RabbitMQ,以便向外部系统提供陷阱通知。
我的系统由3个组成部分组成:
snmptrapd部分很简单:
authCommunity execute mycom
traphandle default /root/some_script
在我的第一次尝试中,some_script
是用Python编写的,但性能并不完美(20个容器在10秒内每秒发送1个陷阱,我只在消费者中收到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();
但我想要更好。我尝试了每秒发送1个陷阱的200个容器,它失败了,只收到了消费者中大约10%的消息。
我认为这与开始,发布和关闭每个陷阱收到的RabbitMQ中的通道的开销有关,因为在网络级别我收到所有消息(通过tcpdump检查)。
有没有办法保持一个永远开放的发布渠道,所以我不必重新打开/创建与队列的连接?
答案 0 :(得分:0)
询问您是否可以在没有连接到RabbitMQ服务器的情况下与RabbitMQ服务器通信,就像询问您是否可以通过电话与某人通话而无需先连接到手机(通过拨号和接听)。
如果你要发送多条消息,你真的应该重用你的连接,但你确实需要先连接!
无论如何,问题不在于发布商。如果消费者失去了消息,那就是消费者。