我正在用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条消息。
据我所知,通道不是线程安全的,我们应该在每个线程上都有一个单独的通道。但是我们每个应用程序应该只有一个连接吗?问题是每个线程都有单独的连接吗?