始终打开发布渠道RabbitMQ

时间:2016-12-29 18:00:18

标签: python performance perl rabbitmq snmptrapd

我正在尝试集成snmptrapd和RabbitMQ,以便向外部系统提供陷阱通知。

我的系统由3个组成部分组成:

  • 带有snmptrapd和RabbitMQ(Publisher)的Linux虚拟机;
  • 使用RabbitMQ(消费者)的Linux虚拟机;
  • 带有docker的Linux裸机,所以我可以有很多容器发送陷阱(使用nping)

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检查)。

有没有办法保持一个永远开放的发布渠道,所以我不必重新打开/创建与队列的连接?

1 个答案:

答案 0 :(得分:0)

询问您是否可以在没有连接到RabbitMQ服务器的情况下与RabbitMQ服务器通信,就像询问您是否可以通过电话与某人通话而无需先连接到手机(通过拨号和接听)。

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

无论如何,问题不在于发布商。如果消费者失去了消息,那就是消费者。