1. 程式人生 > 其它 >RabbitMQ - 常用佇列之Worker模式(一對多模式)

RabbitMQ - 常用佇列之Worker模式(一對多模式)

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);

  可以看出消費快的消費者接受了更多的訊息,這就是能者多勞模式的體現