了解 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