Producer和Consumer都應該去建立這個queue,儘管只有一個地方的建立是真正起做用的算法
Connection:每一個客戶端與MQ都是經過一個TCP長連接通訊的。安全
Channels: 虛擬鏈接。它創建在上述的TCP鏈接中。app
Direct exchange:一對一匹配fetch
Fanout exchange:一對多廣播設計
Topic exchange: 對key進行模式匹配隊列
virtual host:路由
每一個virtual host本質上都是一個RabbitMQ Server,擁有它本身的queue,exchagne,和bings rule等等。這保證了你能夠在多個不一樣的application中使用RabbitMQ。用於隊列安全隔離。hash
消息刪除方式:it
默認狀況下,RabbitMQ 會順序的分發每一個Message。當每一個收到ack後,會將該Message刪除,而後將下一個Message分發到下一個Consumer。這種分發方式叫作round-robin--循環分發。io
channel上的no_ack=true/false,設置消息刪除方式,true是消費即刪除,false是返回ack後刪除。
爲了保證數據不被丟失,RabbitMQ支持消息確認機制,即acknowledgments。爲了保證數據能被正確處理而不單單是被Consumer收到,那麼咱們不能採用no-ack。而應該是在處理完數據後發送ack。
在處理數據後發送的ack,就是告訴RabbitMQ數據已經被接收,處理完成,RabbitMQ能夠去安全的刪除它了。
若是Consumer退出了可是沒有發送ack,那麼RabbitMQ就會把這個Message發送到下一個Consumer。這樣就保證了在Consumer異常退出的狀況下數據也不會丟失。
這裏並無用到超時機制。RabbitMQ僅僅經過Consumer的鏈接中斷來確認該Message並無被正確處理。也就是說,RabbitMQ給了Consumer足夠長的時間來作數據處理。
默認狀況下,消息確認是打開的(enabled)。
消息持久化:
爲了保證在RabbitMQ退出或者crash了數據仍沒有丟失,須要將queue和Message都要持久化。
queue的持久化須要在聲明時指定durable=True
公平分發:
默認狀況round-robin循環分發會讓處理能強的Consumer處於閒置狀態,處理能力差的Consumer處於忙碌狀態。
經過 basic.qos 方法設置prefetch_count=1 。這樣RabbitMQ就會使得每一個Consumer在同一個時間點最多處理一個Message。換句話說,在接收到該Consumer的ack前,他它不會將新的Message分發給它。
注意,這種方法可能會致使queue滿。固然,這種狀況下你可能須要添加更多的Consumer,或者建立更多的virtualHost來細化你的設計。
publish / subscribe:經過exchange的廣播模式fanout實現
臨時隊列temporary queue,
聲明queue時不指定名字,那麼RabbitMQ會隨機爲咱們選擇這個名字,經過result.method.queue 能夠取得queue的名字。
Consumer鏈接MQ時建立一個臨時隊列,斷開鏈接時刪除此隊列,能夠加個exclusive的參數
result = channel.queue_declare(exclusive=True)
將沒有名字的queue綁定在fanout類型的exchange,達到臨時訂閱
channel.queue_bind(exchange='logs', queue=result.method.queue)
routing_key:
Direct exchange的路由算法很是簡單:經過binding key的徹底匹配
Topic exchange的路由經過模糊匹配
fanout的exchange來講,這個參數是被忽略的,由於是廣播。