我有一个.NET Core控制台应用程序,该应用程序从RabbitMQ读取消息并将数据保存到数据库中。它使用RabbitMQ.Client程序集5.1.0并设置如下的EventingConsumer:
var factory = new ConnectionFactory
{
HostName = _hostName,
UserName = _userName,
Password = _password,
RequestedHeartbeat = 20,
AutomaticRecoveryEnabled = true,
NetworkRecoveryInterval = TimeSpan.FromSeconds(10)
};
_connection = factory.CreateConnection();
_channel = _connection.CreateModel();
_channel.BasicQos(0, prefetchCount, false);
var consumer = new EventingBasicConsumer(_channel);
consumer.Received += HandleMessage;
_consumerTag = _channel.BasicConsume(_queueName, false, consumer);
如果我在_channel.BasicAck
方法内的消息上调用HandleMessage
,即,每收到一条消息,发送的消息速率约为1500 /秒。但是,我想等待ACK消息,直到将其保存到数据库。如果我这样做,则速度会降至300-500 /秒。
保存到数据库是在单独的线程上完成的,而不是瓶颈。 HandleMessage
仅将消息存储在内存中,以后再保存到另一个线程中。我尝试使用100到100,000之间的各种prefetchCount
值进行尝试,但这似乎无关紧要。如果我分析了应用程序,我可以看到AMQP会话线程(“ WorkPool-Session#1:Connection(...)”将大部分时间都花在RabbitMQ.Client.ConsumerWorkService+WorkPool.Loop()
我在做什么错?如何在不立即确认消息的情况下更快地消耗消息? (服务器为RabbitMQ 3.7.7)