当有未确认的未解决消息时,RabbitMQ使用者会变慢

时间:2018-09-06 13:36:48

标签: .net-core rabbitmq

我有一个.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()

中的WaitHandle上)

我在做什么错?如何在不立即确认消息的情况下更快地消耗消息? (服务器为RabbitMQ 3.7.7)

0 个答案:

没有答案