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

Laravel Queue worker on AWS SQS - lots of requests?

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

但是,我收到来自 Amazon 的电子邮件,我已经在 887,457 个免费层的请求 1,000,000 个 Amazon Simple Queue Service 请求。

我想知道我是怎么得到这个数字的?工人是否轮询被视为请求的队列?如果是这样,我们可以增加这个间隔吗?

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

php artisan queue:work --help

默认值为 3 秒,因此您的每个工作人员似乎每 3 秒就会发出一个请求。如果有 2 个工作人员,那就是每天 57,600 个请求。如果自您开始此操作以来已经过去了大约 2 周,那将是约 80 万个请求。

此外,我还记得亚马逊 SQS 消息中有类似最大消息大小的限制。他们处理大消息的方式是,他们将一条消息计为多个请求。前一段时间,这就是我达到免费等级限制的原因。大消息的一个例子是作业,它在构造函数中有大对象(eloquent 模型)。这些对象似乎是序列化的,这就是消息如此庞大的原因。

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

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

这意味着如果队列中没有消息,SQS 最多 20 秒不会响应。那是 20 秒,如果仍然没有消息,或者更短,如果有任何消息进入队列。这大大减少了 20 倍的 SQS 请求,加上实际有作业要处理的请求。