RabbitMQ 教程

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

  1. 在數據處理結束後發送ack,這樣RabbitMQ Server會認爲Message Deliver 成功。
  2. 持久化queue,能夠防止RabbitMQ Server 重啓或者crash引發的數據丟失。
  3. 持久化Message,理由同上。

 

公平分發:

默認狀況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的路由經過模糊匹配

  • * (星號) 表明任意 一個單詞
  • # (hash) 0個或者多個單詞

fanout的exchange來講,這個參數是被忽略的,由於是廣播。

相關文章
相關標籤/搜索