RabbitMQ - 常用佇列之Worker模式(一對多模式)
阿新 • • 發佈:2021-06-21
Worker模式介紹
Worker模式其實就是一對多模式,我們定義兩個消費者來看看效果:
預設情況下,RabbitMQ會順序的將message發給下一個消費者。每個消費者會得到平均數量的message。這種方式稱之為round-robin(輪詢)。
但是很多情況下並不希望訊息平均分配,而是要消費快的多消費,消費少的少消費.還有很多情況下一旦其中一個宕機,那麼另外接收者的無法接收原本這個接收者所要接收的資料。
我們修改其中一個消費者程式碼,讓其等待5秒。在等待中停止執行 看看效果。
consumer.Received += (ch, ea) => { string message = Encoding.Default.GetString(ea.Body.ToArray()); Console.WriteLine($"接受到訊息:{message}"); Thread.Sleep(5000); };
當消費者宕機後消費者1並沒有接受宕機後的資料。所以我們需要訊息確認來解決這個問題。
RabbitMQ訊息確認Rabbit中存在兩種訊息確認模式
- 自動模式 - 只要訊息從佇列獲取,無論消費者獲取到訊息後是否成功消費,都認為是訊息成功消費。
- 手動模式 - 消費從佇列中獲取訊息後,伺服器會將該訊息處於不可用狀態,等待消費者反饋。如果消費者在消費過程中出現異常,斷開連線且沒有傳送應答,那麼RabbitMQ會將這個訊息重新投遞。
修改兩個消費者程式碼,並在其中一箇中延遲確認。
consumer.Received += (model, ea) => { byte[] message = ea.Body; Console.WriteLine("接收到訊息為:" + Encoding.UTF8.GetString(message)); Thread.Sleep(3000); //等待三秒手動確認 channel.BasicAck(ea.DeliveryTag, true); //返回訊息確認 }; //將autoAck設定false 關閉自動確認. channel.BasicConsume(name, false, consumer);
如果在延遲中消費者斷開連線,那麼RabbitMQ會重新投遞未確認的訊息
能者多勞模式 能者多勞是給消費速度快的消費更多的訊息.少的責消費少的訊息.能者多勞是建立在手動確認基礎上實現。
在延遲確認的消費中【消費者】新增BasicQos
// 3、建立通道 IModel channel = connection.CreateModel(); // 3.1、每次只能向消費者傳送一條資訊,再消費者未確認之前,不再向他傳送資訊 channel.BasicQos(0, 1, false);
可以看出消費快的消費者接受了更多的訊息,這就是能者多勞模式的體現