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

2024-04-27

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

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

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

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

我的计划最初是这样的:

处理表单提交的代码

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

我读过有关扇出架构 http://docs.aws.amazon.com/sns/latest/dg/SNS_Scenarios.htmlAWS 表示。

我对扇出架构示例的问题(据我所知)是这样的:

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

我找到了建议的可能解决方案here http://forecastcloudy.net/2011/07/12/using-amazons-simple-notification-service-sns-and-simple-queue-service-sqs-for-a-reliable-push-processing-of-queues/

建议的解决方案是:

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

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

  3. 我的网络应用程序被触发后,将轮询现在已连续排队消息的同一个 SQS 队列,直到队列为空

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

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


我的网络应用程序将在队列本身有消息之前轮询队列

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

如果您响应来自 SNS 的通知而轮询队列,您will如果您使用长轮询,则可以在那里找到消息。消息可能会延迟,但是highly不太可能。

不过,另一个问题是您断言您不希望应用程序不断轮询 SQS。我经常遇到这种反对意见,而且它常常是错误的。对于 SQS 长轮询,“持续”轮询空队列意味着每 20 秒一次请求。即 3 个请求/分钟、180 个请求/小时、4320 个请求/天、129600 个请求/月……结果低于每月允许的 100 万个免费请求。

服务器对通知做出反应而不是在后台使用适当数量的工作人员轮询队列的问题是,您可能很容易被大约同时到达的大量作业淹没。如果你有10个并发请求,你能处理吗? 100? 1000?通常,对于像这样的异步作业,请求作业的成本(就资源而言)比执行作业的成本要低(例如,上传图像所需的 CPU 比调整图像大小所需的 CPU 少得多)。除非你协调你的反应,否则你的系统可能会不堪重负。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过 PHP 使用 AWS SQS/SNS 作为推送通知队列来执行繁重的处理任务? 的相关文章

  • PHP_CodeSniffer - 显示失败的嗅探

    PHP CodeSniffer 中是否有设置来显示失败的嗅探 我将输出与我们的编码标准进行比较 并且一一使用很难破译哪个测试失败 看看我们可能想忽略哪个 如果有一种简单的方法来显示故障嗅探 那么我可以更轻松 更快地完成配置 您可以使用 s
  • 将子域重定向到 CakePHP 操作

    背景 我有一个 CakePHP 应用程序 位于 m 我想写一个根级别的 htaccess文件 它将重定向网站的 子域 作为操作的参数 例如 我想编写一个重写规则 这将导致像这样的重定向 http mysite myserver com ht
  • PDOException SQLSTATE[HY000] [2002] 我的本地计算机上的连接超时

    最近我从服务器导入了代码 但本地代码无法连接到远程 mysql 数据库 所以我有两个问题 我可以访问我的远程数据库吗 如果是 为什么我的代码不起作用 如果没有 有没有办法绕过这个问题 我不想复制在本地计算机上运行的 mysql 数据库 我的
  • 如何使用 PHP 创建动态页面标题

    大家好 我想知道是否有人可以帮助解决这个 PHP 问题 是否可以使用 H2 标记中的文本并使用它来动态填充页面标题 我还希望能够使用相同的技术将 H2 文本添加到元描述中 有人可以帮忙吗 如果您的 h2 文本是动态创建的 那么网页的其他部分
  • PHP7 返回类型为 JSON

    PHP 7 有一个新功能 即返回类型声明 我们可以返回一个 字符串 类型 例如 function myFunction a string 我们还可以返回一个 数组 类型 例如 function myFunction a array 但是我们
  • 使用 PHP 将 mysql 值转储到 JSON 文件中

    我正在尝试使用 PHP 从 mysql 数据库生成 JSON 文件 到目前为止 我有
  • PayPal Rest API for Payments 在沙箱中返回 NULL

    我有一个 PayPal 沙盒帐户 我可以在 PHP 上使用curl 通过 api 检索令牌 但是处理测试卡只会返回 null 有人看到代码有问题吗 这是 PayPal 沙盒的已知问题吗 下面代码片段中的客户端是伪造的 但是 如前所述 使用我
  • Cloudwatch 仪表板:具有独立时间范围的小部件?

    我希望仪表板中的每个小部件都有自己的时间范围 我找不到办法做到这一点 如果不可能的话 我会发现它令人难以置信 我希望我的仪表板包含以下内容堆积区域小部件 过去一小时内 30 秒周期的请求计数 即 120 个绘图点 过去一天以 1 小时为周期
  • 在 WooCommerce 订单和电子邮件中添加并显示自定义购物车项目数据

    我有一个名为彩票的自定义 woocommerce 产品类型 我需要在其上添加一个自定义选择字段 因为它不是可变产品 所以我添加了一个 一切工作正常 我在购物车和结帐中也获得了价值 但我无法在管理订单或订单邮件 客户和管理员 中获得价值 这是
  • Laravel 5 Eloquent 关系:无法修改/覆盖关系表属性

    我正在使用 Laravel 5belongsToMany使用中间数据透视表定义相关表的方法 我的应用程序正在使用雄辩的模型Tour and 旅游类别 在游览模型中我有 namespace App use Illuminate Databas
  • 通过日期选择器过滤查询后检索具有特定值的行数[重复]

    这个问题在这里已经有答案了 目前 我正在使用 CodeIgniter 来检索特定时间范围内的数据 所有这些条目都有一个状态 我想将具有相同状态的所有条目分组并将其显示在各自的标题中 目前 这是我的模型类 其中我有以下条目来返回特定日期范围内
  • 是否可以使用 PHP 检测用户来自哪个操作系统? (Mac 或 Windows)

    比方说 我想回应 你正在使用 Windows 或 您正在使用 Macintosh 具体取决于用户的操作系统 这可能吗 通过分析 SERVER HTTP USER AGENT 可以说出什么system and browser 用户是claim
  • 如何在 phpfarm php 安装上安装 pthreads

    记录我为帮助他人所做的努力 并希望得到一些关于我如何做得更好的反馈 命令pecl install pthreads由于我的 php 安装失败ubuntu 13 04盒子没有配置 zts Options 1 ubuntu存储库没有启用zts的
  • 如何使用来自数据库的值来定义 Twig 模板的全局变量?

    我想为 twig 定义一个全局变量 可以从任何模板访问它 我可以在 symfony 中创建一个全局变量config packages twig yaml 但我需要它是从数据库获取的值 在 twig 的文档中 它说使用此代码 twig new
  • 如何设置外键id的id #sf2 #doctrine2

    我正在尝试手动为对象设置外键 id 但没有找到如何执行此操作 class Item ORM ManyToOne targetEntity MyBundle Entity ItemType inversedBy itemTypes ORM J
  • 如何在 MySQL 中使用 INET_ATON 进行通配符搜索 IP 地址?

    我发现这个方法可以使用 INET ATON 将 IP 地址作为整数存储在 MySQL 数据库中 https stackoverflow com a 5133610 4491952 https stackoverflow com a 5133
  • PHP strtotime返回Mysql UNIX_TIMESTAMP的不同值

    我在 stackoverflow 上搜索过帖子 发现了一些类似的帖子 但我认为这是一篇不同的帖子 我的 PHP 和 Mysql 服务器的时区全部设置为 UTC 在表中我使用时间戳字段 值为 2010 11 08 02 54 15 我使用这样
  • SQL查询:按字符长度排序?

    是否可以按字符总数对sql数据行进行排序 e g SELECT FROM database ORDER BY data length 我想你想用这个 http dev mysql com doc refman 5 0 en string f
  • 在 Laravel 视图中使用 CSS?

    我刚刚开始学习 Laravel 并且可以掌握控制器和路由的基础知识 我的操作系统是 Mac OS X Lion 它位于 MAMP 服务器上 我的routes php代码 Route get function return View make
  • 使用 php 变量更改 css 类

    这里需要您的帮助 正如标题所示 我正在尝试使用 PHP 变量更改 css 类 所以基本上我想创建一个回显某些代码的循环 但我希望第一个循环中的 div 类有所不同 它应该被隐藏 这是我为使问题变得清晰而编写的简化代码 我不知道错误在哪里 请

随机推荐

  • 旋转 UISplitViewController 后模态消失

    我有一个奇怪的问题 UISplitViewController 我的主视图控制器中有一个按钮 点击时会打开一个模式视图 使用简单的故事板转场 但是 当我旋转 iPad 时 模式视图会消失 但仅限于从纵向旋转到横向时 我的主视图控制器以纵向隐
  • Intellij Idea 中 Dockerfile 部署失败(未连接到 docker)

    我是 Docker 新手 只是想按照此中的说明进行操作 我创建了非常简单的 Dockerfile 但部署失败 问题是没有太多信息 Docker 已启动并正在运行 我可以从 IDE 连接到它 码头工人信息 如果您最近更改了 Docker De
  • DbContext.Entry 附加实体

    从我的研究中 我了解到调用 DbContext Entry someEntity 会自动将实体附加到上下文 然而 当我这样做时 我发现实体的状态是分离的 任何人都可以阐明这一点以及 DbContext Entry 的工作原理吗 我正在使用
  • 如何纠正 Rails 控制台命令的错误?

    当我位于 Rails 应用程序的根目录中时 我可以成功执行rails server 但是当我尝试做时rails console or rails c我收到以下错误 myrailsapp master rails c Users myuser
  • 如何从 ActionBar 中删除顶部边框阴影

    我正在开发一个新的 Android 应用程序 由于某种原因 这个新应用程序 我自己没有添加额外的代码 在操作栏上有一个顶部边框阴影 好像是我使用 Android Studio 创建新项目时默认添加的 我怎样才能有一个只有底部阴影的普通操作栏
  • 使用 Javascript(或任何客户端)绘制方程

    有没有可以用来绘制数学方程的库 最好使用 javascript 我也可以使用 Java 或者任何客户端 你看过 弗洛特 吗 http code google com p flot http code google com p flot
  • 如何在 Bluez/Linux 上从 GATT 服务器获取断开连接事件

    环境 Bluez 5 14 Linux 3 1 USB 可插拔 BLE 无线电 TI BLE 密钥卡 CC2541 开发套件 Linux 设备 USB BLE 无线电 我们使用 gatttool 启用 TI 密钥卡上的按键事件并开始监听事件
  • 如何在应用样式器功能后删除列

    应用样式器后如何删除列 这是我的样式函数 def highlight late x c1 background color red condition m x price 1 lt x price main x m2 x price 2 l
  • Android 错误:二进制 XML 文件第 16 行:添加地图片段时膨胀类片段时出错

    我正在尝试使用地图 api v2 显示地图 这是我的 xml 代码
  • d3 转换改变了哪些属性?

    我试图了解 d3 中到底发生了什么转换 例如 var bars svg selectAll null data my values enter append rect statement before transition attr x 1
  • 什么是 lub(null, Double)?

    表15 25 B http docs oracle com javase specs jls se8 html jls 15 html jls 15 25在 JLS 版本 8 中表示条件表达式的类型 true null 0 0 is lub
  • 由于 poms 中的版本发生更改,合并来自 Maven 发布分支的更改会产生冲突

    按照标准实践 我有一个用于功能开发的 svn 主干 以及一个用于构建版本的分叉分支 该分支是使用 maven 发布插件创建的 该插件也用于创建发布 碰巧的是 偶尔的错误将在分支上修复 并且这些更改需要合并回主干 为了不错过任何更改 我希望能
  • SwiftUI 列表内存问题,图像未从 RAM 中释放导致崩溃

    我正在将图像加载到 SwiftUI 列表中 当向下滚动太多图像时 RAM 会飙升并导致应用程序崩溃 为什么当用户向下滚动经过图像时图像不会被释放 我正在加载图像 如下所示 List allProducts id self product i
  • Django 外键多对一关系显示在模板上

    我正在尝试显示与公司 多对一 相关的工作机会 但我无法做到这一点 我已经尝试了很多循环 但我什至没有得到查询集 所以我一定做错了 但无法解决我做错的事情 My files 模型 py class Company models Model f
  • 将 div 的内容放在一起以便在 IE8 中打印

    给定以下 HTML 文档 我需要将 表标题 行保留在与 table 在 IE8 中打印时 尽管page break inside avoid 标题和表格之间仍然有一个分页符 我对此的理解表明应该避免分页并且整个div推至第 2 页 文档类型
  • 将选定的下拉列表值从视图传递到控制器

    我想从我的视图将参数 字符串 传递到我的控制器 该值应该是从视图的下拉列表中选择的值 单击按钮后会调用该方法 但在控制器中 该参数始终为空 在视图中 using Html BeginForm Send Overview FormMethod
  • iOS客户端的Youtube API如何获取Client Secret?

    我正在开发 iOS 应用程序 其中包含在 Youtube 上上传视频的功能 我遵循了一个示例项目yt direct lite ios https github com youtube yt direct lite iOS 该项目需要客户编号
  • rdf:seeAlso 和 rdfs:seeAlso 之间的区别

    有什么区别rdf seeAlso and rdfs seeAlso 当我可以使用时rdf seeAlso当我可以使用时rdfs seeAlso 你能举出一些例子吗 首先 请注意rdf and rdfs分别是常用于引用 RDF 语法和 RDF
  • pandas to_json() 多余的反斜杠

    我有一个包含电影数据的 csv 文件 我正在尝试将其重新格式化为 JSON 文件以在 MongoDB 中使用它 所以我将该 csv 文件加载到 pandas DataFrame 中 然后使用 to json 方法将其写回 DataFrame
  • 如何通过 PHP 使用 AWS SQS/SNS 作为推送通知队列来执行繁重的处理任务?

    我有一台在机架空间上运行的服务器 它托管一个 PHP Web 应用程序 PHP Web 应用程序将接受表单提交 然后需要根据表单字段条目执行任务 该任务 我们将其称为生成元数据任务 需要相当多的处理时间 我想知道如何允许表单提交直接保存到数