2014-05-06 28 views
3

我想用Laravel設置一個IronMq隊列,並且我已經將它工作了,但重點在於行爲不是所期望的。我期待IronMq等待一個作業完成後($ job-> delete())推送一個新作品,但是我發現它在前一個作業完成之前推送消息。Laravel IronMq隊列不需要的並行執行

Route::post('queue/send' ,function() 
{ 
    ... 
    Queue::push(function($job) use ($data) 
    { 
     ... 
     $job->delete(); 
    } 
    return true; 
} 

有沒有人發現,以防止平行行爲並使其連續方式:

的代碼結構如下?

非常感謝!

回答

0

謝謝你的答案,我決定用Beanstalkd而不是IronMQ。

它更混亂,但它提供了所需的功能,我不依賴於任何人。

2

無論作業是否完成,推送隊列自然會繼續推送消息,因爲它們是2個獨立的系統。其次,利用推送隊列的目的是爲了儘可能實時。

IronMQ特別是has retries這聽起來會按照指定的時間間隔(您設置的)重試將消息推送到所需的端點X次數(您設置) - 希望這有助於解決您的問題。

如果你希望一個工作只能在前一個完成時被處理,並且稍微延遲是可以接受的,那麼我建議輪詢隊列並分批檢索。你

+0

我想輪詢隊列或使用Iron Worker是要走的路,但我無法理解隊列系統如何不能一次只有一個進程。 重試是不是一個解決方案,因爲該流程得到了很好的處理,但有一些併發問題。 謝謝你的回答! –

+0

與延遲作業或應用內排隊系統不同,推送隊列不知道作業何時在服務器端完成。這兩個是獨立的系統。 – Yaron

1

也可以嘗試,而不是使用laravel Queue類IronMQ類:

$ironmq = new \IronMQ(array(
    'token' => Config::get('queue.connections.iron.token', 'xxx'), 
    'project_id' => Config::get('queue.connections.iron.project', 'xxx') 
)); 
$ironmq->postMessage($queue_name, "Hello world"); 
+0

當我在config/queue.php文件中將驅動程序設置爲IronMq時,我沒有看到Laravel和IronMq隊列之間的區別。 它如何解決併發問題? –