1. 程式人生 > >【RabbitMQ】work模式

【RabbitMQ】work模式

      上一篇部落格的作為rabbitMQ的入門程式,也是簡單佇列模式,一個生產者,一個消費者,今天這篇部落格介紹work模式,一個生產者,多個消費者,下面的例子模擬兩個消費者的情況。

圖示
        

  一個生產者、兩個消費者;一個訊息只能被一個消費者獲取。

  在work模式中可以分為兩種模式,一種是兩個消費者平均消費佇列中的訊息,即使他們的消費能力是不一樣的,這種似乎不太符合實際的情況。另一種是能者多勞模式,處理訊息能力強的消費者會獲取更多的 訊息,這種模式更符合實際需求。

  生產者:向佇列傳送50條訊息,下面程式碼中,生產者每生產一條訊息後都會休眠一段時間,並且越往後休眠的時間越長。

public class Send {

    private final static String QUEUE_NAME = "test_queue_work";

    public static void main(String[] argv) throws Exception {
        // 獲取到連線以及mq通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();

        // 宣告佇列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        for (int i = 0; i < 50; i++) {
            // 訊息內容
            String message = "" + i;
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");

            Thread.sleep(i * 10);
        }

        channel.close();
        connection.close();
    }
}
消費者1:休眠時間為10ms
public class Recv {

    private final static String QUEUE_NAME = "test_queue_work";

    public static void main(String[] argv) throws Exception {

        // 獲取到連線以及mq通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();

        // 宣告佇列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        // 同一時刻伺服器只會發一條訊息給消費者
        //channel.basicQos(1);

        // 定義佇列的消費者
        QueueingConsumer consumer = new QueueingConsumer(channel);
        // 監聽佇列,手動返回完成
        channel.basicConsume(QUEUE_NAME, false, consumer);

        // 獲取訊息
        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println(" [x] Received '" + message + "'");
            //休眠
            Thread.sleep(10);
            // 返回確認狀態
            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        }
    }
}


消費者2:休眠時間為1000ms

public class Recv2 {

    private final static String QUEUE_NAME = "test_queue_work";

    public static void main(String[] argv) throws Exception {

        // 獲取到連線以及mq通道
        Connection connection = ConnectionUtil.getConnection();
        Channel channel = connection.createChannel();

        // 宣告佇列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);

        // 同一時刻伺服器只會發一條訊息給消費者
        //channel.basicQos(1);

        // 定義佇列的消費者
        QueueingConsumer consumer = new QueueingConsumer(channel);
        // 監聽佇列,手動返回完成狀態
        channel.basicConsume(QUEUE_NAME, false, consumer);

        // 獲取訊息
        while (true) {
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String message = new String(delivery.getBody());
            System.out.println(" [x] Received '" + message + "'");
            // 休眠1秒
            Thread.sleep(1000);

            channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
        }
    }
}

  從上面程式碼中我們知道消費者2的休眠時間更長,消費者1的處理能力應該比消費者2更強,但是最後執行的結果會發現,兩個消費者獲得訊息的數量十一樣的,一個全部為奇數,一個全部為偶數。

  我們把每個消費者中的程式碼:channel.basicQos(1);這句程式碼解開註釋會發現消費者2獲取到8條資料,而消費者1獲取到42條訊息。這樣的結果才符合work模式的能者多勞模式。這句程式碼表示伺服器同一時刻只會傳送一條訊息給消費者,但並不指定是哪個消費者,處理能力高的人會接收到更多的訊息。

小結:

  簡單佇列和work 模式的不同:
  簡單佇列只要訊息從佇列中獲取,無論消費者獲取到訊息後是否成功消費,比如遇到狀況:斷電,都認為是訊息已經成功消費;

  work模式消費者從佇列中獲取訊息後,伺服器會將該訊息標記為不可用狀態,等待消費者反饋,如果消費這一直沒有反饋,則該訊息一直處於不可用狀態。

  具體使用哪種模式具體問題具體分析。

  channel.basicConsume(QUEUE_NAME, false, consumer);false表示監聽佇列,手動返回完成狀態,true表示自動返回。

相關推薦

RabbitMQwork模式

      上一篇部落格的作為rabbitMQ的入門程式,也是簡單佇列模式,一個生產者,一個消費者,今天這篇部落格介紹work模式,一個生產者,多個消費者,下面的例子模擬兩個消費者的情況。 圖示: 

RabbitMQ4、幾種Exchange 模式

copy 消息發送 但是 net with .html ole img lis AMQP協議中的核心思想就是生產者和消費者隔離,生產者從不直接將消息發送給隊列。生產者通常不知道是否一個消息會被發送到隊列中,只是將消息發送到一個交換機。先由Exchange來接收,然後Exch

RabbitMQ4、三種Exchange模式——訂閱、路由、通配符模式

message final 支持 sim 使用 完全 自己的 print ued 前兩篇博客介紹了兩種隊列模式,這篇博客介紹訂閱、路由和通配符模式,之所以放在一起介紹,是因為這三種模式都是用了Exchange交換機,消息沒有直接發送到隊列,而是發送到了交換機,經過隊列綁定交

RabbitMQ三種Exchange模式——訂閱、路由、萬用字元模式

   前兩篇部落格介紹了兩種佇列模式,這篇部落格介紹訂閱、路由和萬用字元模式,之所以放在一起介紹,是因為這三種模式都是用了Exchange交換機,訊息沒有直接傳送到佇列,而是傳送到了交換機,經過佇列繫結交換機到達佇列。 一、訂閱模式(Fanout Exchange):  

轉載設計模式_抽象工廠模式

ron mage ges 定義 ima cnblogs 工廠 一個 相互 定義:為創建一組相關或相互依賴的對象提供一個接口,而且無需指定他們的具體類。 是工廠方法的擴展。    【轉載】設計模式_抽象工廠模式

轉載設計模式_模板方法(學習)

res bootstrap 重載方法 dex col 算法實現 選擇性 parent abstract 模板方法模式,一般是為了統一子類的算法實現步驟,所使用的一種手段或者說是方式。它在父類中定義一系列算法的步驟,而將具體的實現都推遲到子類。 通常情況下,模板方法模式用

0002設計模式之原則

範圍 class 變化 chan reason 一件事 ever 模式 單一職責原則 【1】單一職責原則:   要求一個接口或者類只有一個原因引起變化;    也就是一個接口或者類只有一個職責,它負責一件事情;  There should never be more

JavaScript設計模式-module模式及其改進

uid ... hello 代碼 first 其中 nbsp amp 初學者 寫在前面 編寫易於維護的代碼,其中最重要的方面就是能夠找到代碼中重復出現的主題並優化他們,這也是設計模式最有價值的地方 說到這裏...... 《head first設計模式》裏有一篇文章,是說使用

大戰設計模式13—— 組合模式

component 二叉樹 whole 全部 通過 節點 十分 基礎 進行 組合模式(Composite) 設計模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一、定義 組合多個

錯誤混合模式程序集是針對“v2.0.50727”版的運行時生成的,在沒有配置其他信息的情況下,無法在 4.0 運行時中加載該程序集。

csharp 技術分享 image framework src sharp ted 程序集 方案 解決方案,在app.config中添加一個配置節:startup <?xml version="1.0" encoding="utf-8" ?> <

RabbitMQ3、win7下安裝RabbitMQ

默認 窗體 releases style gen gem 執行 file spl RabbitMQ依賴erlang,所以先安裝erlang,然後再安裝RabbitMQ; erlang,下載地址:http://www.erlang.org/download Rabb

WPFMVVM模式的3種command

src handler 因此 初始化 dex ram view ssi 不同 1.DelegateCommand 2.RelayCommand 3.AttachbehaviorCommand 因為MVVM模式適合於WPF和SL,所以這3種模式中也有一些小差異,比如Relay

RabbitMQ5、RabbitMQ任務分發機制

它的 rtu 忘記 順序 sin spa 機制 一段時間 cto 當有Consumer需要大量的運算時,RabbitMQ Server需要一定的分發機制來balance每個Consumer的load。接下來我們分布講解。 應用場景就是RabbitMQ Server會

大戰設計模式22—— 備忘錄模式

bsp 器) tle 對象狀態 實現機制 責任 破壞 部分 get 備忘錄模式(Memento) 設計模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一、定義 在不破壞封裝的前提

大戰設計模式23—— 原型模式

高新 proto 恢復 麻煩 concrete 進行 就是 small 克隆對象 原型模式(Prototype) 設計模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一、定義 使

大戰設計模式24—— 訪問者模式

對象的訪問 定義 www 否則 title blog .cn 比較 design 訪問者模式(Visitor) 設計模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一、定義 提供

RabbitMQ7、RabbitMQ主備復制是異步還是同步?

處理 問題 主從 https 可靠 sql 關鍵點 不返回 當前 轉自:https://yq.aliyun.com/articles/73040?spm=5176.100240.searchblog.116.RcXYdl 我們知道RabbitMQ可以配置成Queue做主從復

lvsDR模式 NAT模式 fullNat模式

eal mar 1.5 water com p地址 strong ces 客戶 DR模式1)直接路由,發生在數據鏈路層,因此調度器和真實服務器需要在同一個物理網段內 2)由於不需要校驗ip和端口信息,因此負載能力比較強;但是不支持"異地災備(同一個物理網段)&qu

pattern設計模式(3) - Observer觀察者模式

獨立 使用 數據 技術 很多 調用 edi 基於 ace 源碼地址:https://github.com/vergilyn/design-patterns 另外一個大神很全的Github:https://github.com/iluwatar/java-design-pat

WPFMVVM模式的3種command

exceptio 什麽 () rst 響應 接口 too AD event 原文:【WPF】MVVM模式的3種command1.DelegateCommand 2.RelayCommand 3.AttachbehaviorCommand 因為MVVM模式適合於WPF和