2016-06-09 231 views
2

我正在將一個cron上運行的一些資源密集型功能移到RabbitMQ隊列中。我厭倦了長時間運行PHP使用者腳本,因此我正在考慮執行以下操作:RabbitMQ basic_get與多個消費者

  1. 作業在一天的開始時添加到隊列中。
  2. cron運行啓動使用者的命令。
  3. 消費者使用basic_get得到一份工作,處理作業,確認工作,然後退出。
  4. cron再次運行並處理下一個作業。

我身邊有多麼好,這將工作幾個問題。

如果我決定通過cron啓動兩名工作人員(運行命令兩次),並且第一份工作仍在處理中,但尚未得到確認,RabbitMQ是否會將相同的工作發送給第二名工作人員?

我注意到basic_consume將是更好的性能,因爲接收到每個作業時,沒有往返。是否有可能使用basic_consume而不是basic_get,而不必擔心工作人員跑了太久?

回答

2

第一部分: 不,不會。這隻會在第一位消費者沒有確認消息而死亡的情況下發生,然後該消息被重新排序並且下一位消費者獲得該消息。

第二部分: 您應該使用basic_consume,因爲它更快,異步並且通常更好。使用任何消息檢索方法與消費者運行多長時間無關。

+2

我同意W代表第一部分/ cantSleepNow和他對basic_consume是更好的性能,當你離開一個用戶活着,讓它處理多條消息是正確的。儘管如此,我不確定我會在你的情況下建議basic_consume。由於您想要處理單個消息並退出該過程,因此basic_get可能是正確的選擇。 –

+0

謝謝你們。該計劃最終將有一個Go應用程序作爲長時間運行的工作人員,每當將作業添加到隊列時都會觸發命令。單一的工作執行只是一個停止的差距,而我們使用PHP作爲監聽器,因爲我不相信長時間運行的PHP腳本的可靠性。所以我猜basic_get會做。如果我們有積壓,我仍然可以激發多個消費者。 @DerickBailey我幾天前註冊了您的RMQPatterns電子郵件,迄今爲止非常有幫助。謝謝! – James