AWS SQS上的Laravel Queue工作人员 - 很多请求?

时间:2018-04-07 15:50:45

标签: php laravel amazon-sqs laravel-queue

我有两个由两个工作人员监控的Amazon SQS队列。我用它来发送电子邮件,发送一些工人请求。典型的后端东西。这个月必须要有几百个工作岗位。

但是,我收到来自亚马逊的电子邮件,我已经在887,457收到了Amazon Simple Queue Service免费等级1,000,000请求的请求。

我想知道我是如何得到这个号码的?工作人员是否轮询被视为请求的队列?如果是这样,我们可以增加这个间隔吗?

3 个答案:

答案 0 :(得分:3)

队列工作者有一个--sleep选项:

php artisan queue:work --help

默认值为3秒,因此似乎每隔3秒就会向您的每个工作人员发出一个请求。有2名工人,每天57,600个请求。如果从你开始这个约2周后,这将是~800k的请求。

答案 1 :(得分:1)

此外,我要记住,亚马逊SQS消息中有一些最大消息大小。他们处理较大消息的方式是将一条消息视为多个请求。前一段时间,这就是我达到免费套餐限制的原因。大消息的示例是作业,在构造函数中具有大对象(雄辩模型)。这些对象似乎已被序列化,这就是消息巨大的原因。

解决方案是仅向作业的构造函数提供简单的数据类型(例如,用户ID,而不是用户对象),然后在作业的handle方法中获取整个对象。

答案 2 :(得分:1)

如果有消息,您可能希望立即做出响应,同时在没有消息时减少对SQS的请求数量。正确的配置称为“长轮询”。这是通过在ReceiveMessage调用或队列默认情况下将“接收消息等待时间”设置为20秒来完成的。由于Laravel没有将参数传递给队列调用的选项,因此您必须在“队列选项”中执行此操作。

这意味着,如果队列中没有消息,SQS将在长达20秒的时间内不响应。如果仍然没有消息,则为20秒,如果有消息进入队列,则为20秒。这样可以将您的SQS请求数量减少20倍,外加实际需要处理的请求。