了解 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()
Environment :
・ Arch Linux
・ Python 2.7
Reference :
・ RabbitMQ official site
・ Pika docs