2016-01-21 58 views
0

在我的生產環境中,有7個並行服務器。我用的Redis進行郵件隊列這樣的:在許多服務器環境中使用redis發送郵件隊列

$this->getRedis()->lpush('mailsQueue', serialize($mail)); 

,那就是聽隊列守護進程:

do { 
    $mail = $this->getRedis()->rpop('mailsQueue'); 

    if ($mail) { 
     // sending an email 
    } 

    usleep(1000); 
} while (true); 

當守護程序只有一個實例運行它工作得很好。但在生產環境中,每臺服務器都有自己的守護程序服務。這造成了一個問題,即有時候,電子郵件發送幾次。這是因爲有時不僅一個守護進程服務會從「mailsQueue」列表中加載相同的電子郵件。

無論我運行多少個守護程序服務,我如何確保只有一次加載帶有「rpop」的元素?

非常感謝您的幫助!

+0

在一天結束的時候,Redis的不是爲此目的設計的...看看RabbitMQ的或這樣的事情... –

回答

0

Wierd,我會說那個rpop會是原子的。您應該可以使用MULTI強制執行交易,以便其他人不會干預該變量。

http://redis.io/topics/transactions

所有在一個事務中的命令被串行化和順序執行。在執行Redis事務的過程中,不會發生由另一個客戶端發出的請求。這保證命令作爲一個單獨的操作被執行。

更多信息:

https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/Transactions.md

相關問題