2016-01-21 79 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

相关问题