RabbitMQ 均衡調度(公平分發機制)


均衡調度是針對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();
     }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM