2015年8月11日

RabbitMQ 教學 (6) - 建立 Work Queue #4 ( Create a work queue using Python #4 )

之前幾篇文章分別討論接收端 ( Consumer )、MQ Server 發生意外停止時的解決方式。但我們還有一個題目需要討論,前面文章中提到 RabbitMQ 會根據 Round-robin dispatching 方式進行,但沒有更靈活的方式嗎?本篇將介紹如何使用另一個方式:Fair dispatch。( 其他 RabbitMQ 相關教學可以參考本篇整理 )



了解 Fair Dispatch
若未特別設定,RabbitMQ 會根據 Round-robin dispatching 方式運作,然而若每次花費時間較久的任務都剛好指派到某一個特定的 consumer,會形成只有某一個 consumer 辛苦的在工作,而其他 consumber 則呈現閒置的情況。為了解決這個問題,RabbitMQ 團隊也提出 Fair Dispatch 的方式。在此方式下,一旦 consumer 呈現閒置的狀態 RabbitMQ 就會指派其他任務給它,如此一來進而提升整體效率。


加入 Fair Dispatch 機制
利用之前的 worker.py 進行修改,加入 Fair Dispatch 機制,內容如下:
import pika
import time

# 建立連線
...

# 宣告 Queue
channel.queue_declare(queue='myRabbitMQ', durable=True)

print ' [*] Waiting for messages. To exit press CTRL+C'

def callback(ch, method, properties, body):
    print ' [x] Received %r' % (body,)
    time.sleep(body.count('.'))
    print ' [x] Done'
    ch.basic_ack(delivery_tag = method.delivery_tag)

# 使用 basic_qos(prefetch_count=1) 來啟用 Fair Dispatch
channel.basic_qos(prefetch_count=1)

channel.basic_consume(callback, queue='myRabbitMQ')
channel.start_consuming()
值得注意的是,若使用這個機制進行任務的指派,當每個接收端 ( Consumer ) 都還在處理任務中,訊息會先暫時存放在 Queue 中等待,當 Queue 達到可容納訊息最大值時,你需要有其他的機制去處理這個情況,例如增加接收端。


Environment :
  ・ Arch Linux
  ・ Python 2.7

Reference :
  ・ RabbitMQ official site
  ・ Pika docs


熱門文章