多个RabbitMq使用者的性能问题

时间:2019-05-27 02:18:43

标签: c# rabbitmq

我正在用C#构建Windows服务,该服务连接到RabbitMq并提取消息进行处理。它旨在用于多线程,并且已经对其进行了设置,以便可以通过配置指定RabbitMq连接属性,要连接的队列,要提取的消息等。

到目前为止,它运行良好。我正在运行一个线程,连接到一个队列,它每秒处理500条以上的消息。

今晚,我试图添加另一个要处理的队列,我注意到处理消息的速度大大降低了(降至每秒50条消息)。

我的应用程序读取一个配置文件,该文件指定需要运行哪些工作程序。 每个工作线程都应该在各自的线程上,并通过Task.Factory.StartNew()启动。

每个工作人员都有自己的IConnection,IConnectionFactory和连接到RabbitMq的通道。

下面是我的工作人员提供的一些示例代码。 它具有建立连接的方法。 您会注意到它创建了与RabbitMq服务器的连接,然后建立了与队列的连接。

public class Worker
{
    private readonly IConnectionFactory _connectionFactory;
    private IConnection _connection;
    private IModel _channel;

    public void EstablishConnection()
    {
     if (_connection == null)
                    {
                        _connection = _connectionFactory.CreateConnection();
                        _connection.ConnectionBlocked += ConnectionBlocked;
                        _connection.ConnectionUnblocked += ConnectionUnblocked;
                        _connection.ConnectionRecoveryError += ConnectionRecoveryError;
                        _connection.RecoverySucceeded += RecoverySucceeded;
                    }

                    _channel = _connection.CreateModel();
                    _channel.BasicQos((ushort)_configuration.PrefetchSize, (ushort)_configuration.PrefetchCount, false);

                    _consumer = new EventingBasicConsumer(_channel);
                    _consumer.Received += MessageReceived;
    }
}

其中只有一个正在运行时,它每秒可以处理500多个消息。 但是,当我在不同的线程上运行两个连接到不同队列的工作程序时,它每秒仅处理50条消息。

有趣的是,在我的测试中,我正在监听的第二个队列为空。里面什么都没有。

我希望它会在每个线程上运行500多个消息。或每个线程上至少有250条消息。

据我所知,通道不是线程安全的,我们应该在每个线程上都有一个单独的通道。但是我们每个应用程序应该只有一个连接吗?问题是每个线程都有单独的连接吗?

0 个答案:

没有答案