均衡調度是針對Consumer來說的。現在有兩個Consumer請求同一個隊列的消息。RabbitMQ會將序號為奇數的消息發給第一個Consumer,會將序號為偶數的消息發送給第二個Consumer。如果第一個Consumer處理消息的時間需要很久,而第二個Consumer很快就處理完已經收到的消息,這樣看來,第一個Consumer很忙,第二個Consumer很空閑,這就白白的浪費了系統資源。要是每個Consumer處理完一個消息后再去獲取下一個消息,這是多么理想呀!針對這種情況,RabbitMQ也想到了。解決方法如下:
設置當前Consumer的預取數量為1個就行啦!
channel.BasicQos(0, //設置0 1, //預取數量設置為1個 false); //設置false
Consumer端整個代碼如下:
var factory = new ConnectionFactory() { HostName = "localhost", UserName = "ty2017", Password = "123456",VirtualHost="log" }; using (var connection = factory.CreateConnection()) { using (var channel = connection.CreateModel()) { channel.QueueDeclare(queue: "q.log.info", durable: false, exclusive: false, autoDelete: false, arguments: null); //設置預取消息的數量為1個,消費完當前的消息后再去獲取下一個消息 channel.BasicQos(0, 1, false); var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); Console.WriteLine(" {0}", message); channel.BasicAck(ea.DeliveryTag, false); }; channel.BasicConsume(queue: "q.log.info", noAck: false, consumer: consumer); Console.ReadLine(); } }