如何通过PHP将AWS SQS / SNS用作推送通知队列来执行繁重的处理任务?

金·斯塔克斯

我有一个在机架空间上运行的服务器,该服务器托管一个PHP Web应用程序。

PHP Web应用程序将接受表单提交,然后需要根据表单字段条目执行任务。

该任务(称为生成元数据任务)需要大量的处理时间。我想知道如何允许表单提交直接保存到数据库中,并在后台运行生成元数据任务时立即向用户显示成功页面。

我已经"aws/aws-sdk-php": "~3.11"使用Composer安装到了同一Web应用程序中。

我的计划最初是这样的:

处理表单提交的代码

$result = $model->save($_POST);
// this code will send the information to either SQS or SNS
$awsClient->sendsMessage($_POST);
if ($result) {
  $this->redirect('success.html');
}

我已经阅读了AWS提出扇出架构

我的扇出体系结构示例问题(据我了解)是:

  1. 将消息发送到SQS或SNS的服务器也将是处理生成元数据任务的服务器。实际上,它是同一个Web应用程序。
  2. SQS完成了队列部分(因为我想在FIFO中执行任务,并且完成任务确实需要很长时间)。但是,这需要我的Web应用程序才能连续轮询SQS。我想要推送通知(从AWS到我的Web应用程序),而不是我的Web应用程序连续轮询AWS以检查要执行的任务。

我在这里找到了可能的解决方案

建议的解决方案是:

  1. 将消息发送到SNS主题。

  2. SNS主题将同时向SQS队列和我的Web应用程序发送消息。

  3. 触发后,我的Web应用程序将轮询相同的SQS队列,该队列现在已连续将消息排队,直到队列为空

我从中看到的缺点是,我的Web应用程序将在队列本身收到消息之前轮询队列。

使用AWS服务实现推送队列的最佳方法是什么?

迈克尔-SQLbot

我的Web应用程序将在队列本身收到消息之前轮询队列

您还没有尝试过,对吧?:)恐怕您想得太多了。SQS的轮询时间很长,这会导致轮询请求在SQS端被挂起,直到至少有一条消息可用为止,这时将返回该消息(达到您请求的最大数目)。您可以将较长的轮询等待时间设置为1到20秒。如果在此时间段内没有可用消息,则返回没有消息的响应。

如果您响应SNS的通知而轮询队列,则使用长轮询将在其中找到消息。它的邮件可能会被推迟,但非常不可能的。

但是,另一个问题是您断言您不希望该应用程序不断轮询SQS。我经常遇到这个异议,而且它经常放错地方。使用SQS长轮询,“恒定”轮询一个空队列意味着每20秒发出一个请求。那是3要求/分钟,180要求/小时,4320要求/天,129600要求/月...事实证明这少于每月允许的100万免费请求。

服务器对通知作出反应而不是在后台与适当数量的工作人员轮询队列的问题是,您可能很容易被大量大约同时到达的作业所淹没。如果您收到10个并发请求,可以处理吗?100?1000?通常,对于像这样异步的作业,请求作业(在资源方面)比执行作业要花费更少的费用(例如,上载映像所需的CPU数量要比调整该映像所需的CPU少得多)。除非协调您的反应响应,否则您可能会不堪重负。

不要在不适用的情况下陷入“轮询不好,推送好”的概念陷阱。在绝大多数情况下,这种观点是绝对正确的...轮询几乎总是错误的解决方案...但是对于SQS长轮询,您真正拥有的是一种推送机制,其包装方式使其与HTTP兼容,而轮询的许多固有弊端……消失了。如果您正在进行长时间轮询,则队列为空,并且有一条消息到达,您的长时间轮询将几乎立即随该消息一起返回。它不会等待超时发生。毕竟,监视队列的后台进程可能是一个好方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何识别馈送DLQ SQS的SQS队列

来自分类Dev

如何跟踪通过SQS队列AWS X射线的请求

来自分类Dev

将消息从 AWS SNS 发布到 SQS

来自分类Dev

从AWS Lambda读取SQS队列

来自分类Dev

SQS队列需要什么权限才能通过SNS接收来自SES的通知?

来自分类Dev

我应该能够将 moto SNS 通知订阅到 moto SQS 队列吗?

来自分类Dev

一次通过AWS SQS与DeliveryDelay进行通知

来自分类Dev

AWS SQS未收到SNS消息

来自分类Dev

如何使用 AWS DynamoDB 和 AWS SQS 创建作业队列?

来自分类Dev

与Laravel中的AWS Sqs队列相关的错误

来自分类Dev

从AWS上的SQS队列连续轮询

来自分类Dev

AWS SQS 队列是否相互隔离?

来自分类Dev

通过过滤将消息从Amazon SNS路由到SQS

来自分类Dev

通过过滤将消息从Amazon SNS路由到SQS

来自分类Dev

将SqsListener与SNS和SQS结合使用

来自分类Dev

AWS sqs从CLI发送消息批处理

来自分类Dev

AWS sqs从CLI发送消息批处理

来自分类Dev

使用 AWS SQS 处理长查询

来自分类Dev

无法编写简单的php代码来调用AWS sqs

来自分类Dev

如何在AWS SQS队列上添加权限?

来自分类Dev

如何从外部SQS队列活动触发AWS Lambda函数

来自分类Dev

如何在nodeJS中获取AWS SQS队列ARN?

来自分类Dev

如何在Rails中创建AWS SQS FIFO队列?

来自分类Dev

如何从 AWS 中的 SQS 队列接收超过 1 条消息?

来自分类Dev

如何在访问之前检查 aws sqs 队列是否可用?

来自分类Dev

AWS SQS如何工作以将消息从队列传递到客户端

来自分类Dev

如何在AWS CloudFormation中创建Amazon SQS队列并将其订阅到Amazon SNS主题?

来自分类Dev

每当在我的AWS SQS目标上推送通知时,如何触发事件?

来自分类Dev

如何使用Lambda函数处理SQS队列(不通过计划的事件)?

Related 相关文章

热门标签

归档