我有一个在机架空间上运行的服务器,该服务器托管一个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提出的扇出架构。
我的扇出体系结构示例问题(据我了解)是:
我在这里找到了可能的解决方案
建议的解决方案是:
将消息发送到SNS主题。
SNS主题将同时向SQS队列和我的Web应用程序发送消息。
触发后,我的Web应用程序将轮询相同的SQS队列,该队列现在已连续将消息排队,直到队列为空
我从中看到的缺点是,我的Web应用程序将在队列本身收到消息之前轮询队列。
使用AWS服务实现推送队列的最佳方法是什么?
我的Web应用程序将在队列本身收到消息之前轮询队列
您还没有尝试过,对吧?:)恐怕您想得太多了。SQS的轮询时间很长,这会导致轮询请求在SQS端被挂起,直到至少有一条消息可用为止,这时将返回该消息(达到您请求的最大数目)。您可以将较长的轮询等待时间设置为1到20秒。如果在此时间段内没有可用消息,则返回没有消息的响应。
如果您响应SNS的通知而轮询队列,则使用长轮询将在其中找到消息。它的邮件可能会被推迟,但非常不可能的。
但是,另一个问题是您断言您不希望该应用程序不断轮询SQS。我经常遇到这个异议,而且它经常放错地方。使用SQS长轮询,“恒定”轮询一个空队列意味着每20秒发出一个请求。那是3要求/分钟,180要求/小时,4320要求/天,129600要求/月...事实证明这少于每月允许的100万免费请求。
服务器对通知作出反应而不是在后台与适当数量的工作人员轮询队列的问题是,您可能很容易被大量大约同时到达的作业所淹没。如果您收到10个并发请求,可以处理吗?100?1000?通常,对于像这样异步的作业,请求作业(在资源方面)比执行作业要花费更少的费用(例如,上载映像所需的CPU数量要比调整该映像所需的CPU少得多)。除非协调您的反应响应,否则您可能会不堪重负。
不要在不适用的情况下陷入“轮询不好,推送好”的概念陷阱。在绝大多数情况下,这种观点是绝对正确的...轮询几乎总是错误的解决方案...但是对于SQS长轮询,您真正拥有的是一种推送机制,其包装方式使其与HTTP兼容,而轮询的许多固有弊端……消失了。如果您正在进行长时间轮询,则队列为空,并且有一条消息到达,您的长时间轮询将几乎立即随该消息一起返回。它不会等待超时发生。毕竟,监视队列的后台进程可能是一个好方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句