Python-RabbitMQ fanout廣播模式
阿新 • • 發佈:2018-01-11
空閑 ron count 現實 打開 公平分發 簡單 實現 mage
2、消費者端
現實生活中,機器的配置不同,有的性能高,有的性能低,有可能A機器處理了四條消息,B機器一條消息還沒處理完,要是按照輪詢方式來分發消息的話,那就是A機器一直是空閑,B機器有一大丟消息處理不完。我們在部署集群的時候,往往要添加一個服務器的權重值,那個服務器性能好就多給它點兒任務,那麽在RabbitMQ怎麽辦呢?RabbitMQ裏的公平分發是指你有多大本事就幹多少活兒,比如A機器處理速度快RabbitMQ就多給它發,B機器處理速度慢就給它少發。
RabbitMQ是這樣做的,Server端在給Client發消息時會先檢查Client端還有多少條消息沒有處理完,如果當前隊列裏消息大於1就不發,隊列裏為空就發。
只需要在**消費者**端加一條短短的代碼channel.basic_qos(prefetch_count=1)即可。
我們編輯兩個消費者端來測試receive.py和receive2.py
編輯完成後,開啟兩個消費者端,用生產者連續發消息測試,可以看到在receive2沒有處理完的時候,生產者的消息是不會發送給它的。
以上例子都是一對一的發消息,也就是說生產者發一條消息,只有一個消費者能接收,那現在學習一下讓所有消費者都能接收到(廣播效果),這時候就要用到Exchange了,Exchange一端接收生產者的消息,一段是把消息投遞到Queue中,Exchange必須精確的知道投遞的精確對象,是投遞到某一個Queue呢,還是投遞到很多的Queue呢,還是刪除?Exchange在定義的時候是有類型的,以決定到底哪些Queue符合條件,可以接收消息。我們可以理解它為"轉發器"。 Exchange類型:
1、fanout:所有綁定到此Exchange的Queue都可以接收消息
2、direct:通過routing_key和Exchange決定的那個唯一的Queue可以接收信息
3、topic:所有符合routing_key(可以是表達式)的routing_key所綁定的Queue可以接收消息
4、headers:通過headers決定把消息發給哪些Queue
fanout就是純廣播,只要綁定到此Exchange的隊列就能收到消息
看一下是怎麽實現的
1、生產者端
代碼中的channel.exchange_declare裏面的參數沒有寫變量,比如exchange="logs",type="fanout",但是寫上會報錯,不知道什麽原因。。。。
2、消費者端
![技術分享圖片](http://i2.51cto.com/images/blog/201801/11/bde7fbb653462383abeebeb23423dc91.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
生產者發消息,多開幾個消費者端,可以看到能同時接收到消息(消費者端執行格式:python publisher.py 你們好)。
註意:在測試的時候我先打開的生產者端,按常理講我再開消費者端的時候是能夠接收到消息的,但事實是沒有消息。。。。原因很簡單,我們想象一下收音機的功能,當你關閉收音機的時候是聽不到廣播的,只有當你打開收音機的時候才能聽到,比如12點打開的收音機,你只能聽到12點的廣播,你是不能聽到11點半的廣播的,說簡單點也就是實時的。 以上就是我們所說的消息的訂閱與發布。
Python-RabbitMQ fanout廣播模式