管理每个用户的Beanstalkd队列

时间:2014-12-13 05:35:57

标签: php laravel queue beanstalkd

让我们说,为了论证,我有一个SMTP服务器,每分钟可以发送60封电子邮件(每秒1封)。

如果我有60个用户希望通过此SMTP服务器发送电子邮件,他们都会向我发送60封电子邮件。

如果我在Laravel中保留1个队列,则会先发送来自#1用户的所有60封电子邮件,然后将发送来自#2用户的所有60封电子邮件,依此类推。用户#60必须等待3,540封电子邮件才能在开始之前发送。

我想在循环的基础上使用Beanstalkd,而我能想到的唯一方法是维护60个管,每个用户一个,但这需要我运行:

php artisan queue:listen --queue=user1,user2,user3,etc,user60

我在这里遇到的问题是,如果用户#61注册,那么在我创建一个新命令之前,他的电子管将不会被听众接听:

php artisan queue:listen --queue=user1,user2,user3,etc,user60,user61

如果我增加到100万用户,建议有100万个电子管吗?

有没有简单的方法可以让Beanstalkd每管取一个工作,因为这些管可以动态创建,我永远不会知道我有多少管?

我面临的问题是我在SMTP服务器上存在瓶颈,所以我需要以循环方式发送这些电子邮件。我可以使用MySQL和Cron Jobs轻松实现这一点,但是当使用MySQL作为排队系统时,这导致过去重复的电子邮件。

1 个答案:

答案 0 :(得分:0)

简短回答,您可以尝试添加更多工作人员,但如果您在SMTP服务器上有漏斗, 你只需要记住你正在用另一个问题取代一个问题。

Client 1 has 60 emails
Client 2 has 60 emails and so on ... until client 60

客户端1只会在一分钟后发送第二封电子邮件,因此需要一小时才能从客户端1发送60封电子邮件。

使用Mandrill或Sendgrid等服务可以更好地服务,您可以在这里使用多个服务器发送消息。

相关问题